dispatch_async无法运行

时间:2015-11-14 02:57:01

标签: ios

我是排队和线程的新手。下面我有以下代码,试图在异步队列中运行各种方法。队列中的每个项目都会在完成后更新计数,当队列中的所有项目完成后,更新计数将完成并准备好返回。

问题是当这段代码运行时,最后一行被调​​用然后,它会挂起而没有错误,我无法继续逐步完成跟踪。

__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];
}

希望经验丰富的眼睛可以指出它。赞赏。

1 个答案:

答案 0 :(得分:0)

请为您的dataTask包含代码。这一行masterUpdateCount += updatedItemsCount; // Never gets called,因为它在完成块中意味着它在你的数据任务完成之前不会运行,你是否在数据任务中设置了一个断点并确保它跳入那里?你有一个NSLog(%@,error.description)行吗?看起来你可能需要在那里做更多的调试。