我发现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];
}
前者是测试中使用的助手,后者实际上是由生产代码调用的。我在代码中没有看到任何明确设置队列大小的地方。
答案 0 :(得分:1)
RKObjectRequestOperation
包含一个内部队列(responseMappingQueue
),它在所有实例之间共享。此队列显式设置为并发计数为1,但它仅用于映射,而不是用于URL连接。
看看你正在做什么,直接在操作上调用start
,你很可能想要考虑将操作添加到队列中,以便你可以更好地管理它们。因为您没有使用对象管理器来运行操作,所以您引用的并发计数5不适用。请查看使用enqueueObjectRequestOperation:
来运行操作。