我正在尝试使用MKNetworkKit从Web服务中获取一系列链接,然后解析后台线程上的每个响应,并使用GCD的dispatch_group_t等待所有线程完成处理。卡住的地方是我无法弄清楚为什么dispatch_group_notify不等待组中的所有线程完成。运行此代码将打印:
results count: 0
added into results, count: 1
added into results, count: 2
调度组未在其线程上等待。我也尝试过dispatch_group_wait,但这使我崩溃了。我不知道MKNetworkKit对NSOperation的使用是否与此问题相冲突。谢谢你的帮助!
- (MKNetworkOperation *)getABunchOfMovies:(NSArray *)movies onCompletion:(CastResponseBlock)completionBlock onError:(MKNKErrorBlock)errorBlock
{
MKNetworkOperation *operation;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
block NSMutableArray *results = [[NSMutableArray alloc] initWithCapacity:[movies count]];
for (NSString *movieTitle in movies) {
operation = [self operationWithPath:REQUEST_URL(API_KEY, [movieTitle urlEncodedString])];
[operation onCompletion:^(MKNetworkOperation *completedOperation) {
dispatch_group_async(group, queue, ^{
NSDictionary *response = [completedOperation responseJSON];
id result = [self processResponse:response withMovieTitle:movieTitle];
@synchronized (results) {
[results addObject:result];
NSLog(@"added into results, count: %d", [results count]);
}
});
}
onError:^(NSError *error) {
errorBlock(error);
}];
[self enqueueOperation:operation];
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"results count: %d", [results count]);
// Return array here
completionBlock(results);
});
dispatch_release(group);
return operation;
}
编辑:
我仍然不知道为什么,但是如果我将其更改为使用dispatch_group_enter(group);并将其与dispatch_group_leave(group);相匹配;在完成模块的末尾,它可以工作。有谁知道为什么会这样吗?
最佳答案
目前,MKNetworkKit不支持队列完成处理程序。
您应该考虑添加操作依赖项,而不是此技巧。
[lastOperation addDependency:op1];
[lastOperation addDependency:op2];
并假设“ lastOperation”完成时,队列确实已经完成。
另一种方法是KVO引擎上的“ operationCount”键路径,并检查它是否达到零。
MKNetworkEngine有一个代码块,该代码块可以执行此操作以显示和隐藏网络活动指示器。
关于objective-c - MKNetworkKit和GCD dispatch_group_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11858527/