2015-11-14 62 views
0

我是新來的隊列和線程。下面我有下面的代碼,試圖在異步隊列中運行各種方法。隊列中的每個項目在完成後將更新一個計數,並且當所有項目在隊列中完成時,更新計數將完成並準備好返回。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類型的方法中,我實際上初始化一個NSURLSessionNSURLSessionDataTask,我實際上通過調用[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

如果您呼叫的主線程的代碼,那麼你將成爲阻止,因爲dispatch_group_wait – Paulw11

+0

的主線程嘗試dispatch_async內的更新方法(dispatch_get_main_queue()) – brandonscript

+1

因爲你還在這將有同樣的問題主隊列。你需要在另一個隊列上調度它 – Paulw11

回答

0

請包括您的dataTask代碼。這條線​​,因爲它在完成塊中,這意味着它在數據任務完成之前不會運行,您是否在數據任務中設置了斷點並確保它在那裏跳轉?你有沒有一個NSLog(%@,error.description)行在那裏,如果你得到一個?看起來你可能需要在那裏做更多的調試。

+0

它現在包括:)。我在'getDataTask'內設置了斷點,它似乎並沒有在那裏跳躍。沒有錯誤被打印。就好像它被完全忽略,儘管調用了'[getDataTask resume]' – Marcel

相關問題