我是新來的隊列和線程。下面我有下面的代碼,試圖在異步隊列中運行各種方法。隊列中的每個項目在完成後將更新一個計數,並且當所有項目在隊列中完成時,更新計數將完成並準備好返回。dispatch_async不運行
問題是,當這段代碼運行時,最後一行被調用,然後,它掛起時沒有錯誤,我無法繼續逐步通過跟蹤。
__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];
}
希望有經驗的眼睛能指出來。讚賞。
如果您呼叫的主線程的代碼,那麼你將成爲阻止,因爲dispatch_group_wait – Paulw11
的主線程嘗試dispatch_async內的更新方法(dispatch_get_main_queue()) – brandonscript
因爲你還在這將有同樣的問題主隊列。你需要在另一個隊列上調度它 – Paulw11