RestKit - 请求阻塞,直到上一次调用完成

时间:2014-04-28 13:05:38

标签: restkit nsoperation nsoperationqueue restkit-0.20

我发现RestKit存在问题,其中一个未完成的远程请求将导致其他请求排队并阻塞,直到前一个请求完成。我已经读过,RestKit将AFNetworking的setMaxConcurrentOperationCount值默认为5,但我遇到的阻塞只有一个未完成的请求。

RestKit的当前版本是否仍默认为5,如果是,那可能导致我缺少并发请求?

RestKit 0.20.3

请求

- (RKManagedObjectRequestOperation*) getUser {
    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    NSDictionary *items = [objectManager.HTTPClient defaultHeaders];
    NSString *auth = [items objectForKey:@"Authorization"];

    if (auth == nil) {
        NSLog(@"You must login first\n");
        return nil;
    }

    auth = [auth stringByReplacingOccurrencesOfString:@"Bearer " withString:@""];

    NSMutableString *path = [NSMutableString stringWithFormat:@"/users?accessToken=%@", auth];
    return [[RKObjectManager sharedManager] appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:path parameters:nil];
}

- (void) getUser:(void ( ^ ) ( RKObjectRequestOperation *operation , RKMappingResult *mappingResult ))success failure:(void ( ^ ) ( RKObjectRequestOperation *operation , NSError *error ))failure {
    RKManagedObjectRequestOperation *requestOperation = [self getUser];
    [requestOperation setCompletionBlockWithSuccess:success failure:failure];

    [requestOperation start];
}

前者是测试中使用的助手,后者实际上是由生产代码调用的。我在代码中没有看到任何明确设置队列大小的地方。

1 个答案:

答案 0 :(得分:1)

RKObjectRequestOperation包含一个内部队列(responseMappingQueue),它在所有实例之间共享。此队列显式设置为并发计数为1,但它仅用于映射,而不是用于URL连接。

看看你正在做什么,直接在操作上调用start,你很可能想要考虑将操作添加到队列中,以便你可以更好地管理它们。因为您没有使用对象管理器来运行操作,所以您引用的并发计数5不适用。请查看使用enqueueObjectRequestOperation:来运行操作。