我是排队和线程的新手。下面我有以下代码,试图在异步队列中运行各种方法。队列中的每个项目都会在完成后更新计数,当队列中的所有项目完成后,更新计数将完成并准备好返回。
问题是当这段代码运行时,最后一行被调用然后,它会挂起而没有错误,我无法继续逐步完成跟踪。
__block int masterUpdateCount = 0;
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self updateStuffWithCompletionCount:^(int updatedItemsCount) {
masterUpdateCount += updatedItemsCount;
}];
[self updateMoreStuffWithCompletionCount:^(int updatedItemsCount) {
masterUpdateCount += updatedItemsCount; // Never gets called
}];
}); // <------ APPLICATION HANGS HERE after calling dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
return masterUpdateCount;
我注意到的是,完成块永远不会被调用,这很可能是它永远挂起的原因,但我的问题是为什么?如果它有帮助,在updateStuffWithCompletionCount
类型内方法我实际上是用NSURLSession
初始化NSURLSessionDataTask
而我实际上是通过调用[task resume];
来运行任务,所以我不明白为什么不会调用完成。
以下是updateStuffWithCompletionCount
方法中的内容:
- (void) updateStuffWithCompletionCount: (void (^)(int)) completionResult
{
__block int updateCount = 0;
NSString *someURL = @"www.someplace.com";
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDataTask * getDataTask = [defaultSession dataTaskWithURL:[NSURL someURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
if(error == nil)
{
// do stuff, if updated, add to count
updateCount ++;
if(updateCount > 0) {
completionResult(updateCount); // Invoke the completion handler
} else {
completionResult(0); // Invoke the completion handler
}
}
else {
NSLog(@"Error: %@", error);
completionResult(-1);
}
}];
[getDataTask resume];
}
希望经验丰富的眼睛可以指出它。赞赏。
答案 0 :(得分:0)
请为您的dataTask包含代码。这一行masterUpdateCount += updatedItemsCount; // Never gets called
,因为它在完成块中意味着它在你的数据任务完成之前不会运行,你是否在数据任务中设置了一个断点并确保它跳入那里?你有一个NSLog(%@,error.description)行吗?看起来你可能需要在那里做更多的调试。