如何知道所有并发的 NSOperations 都完成了

How to know all concurrent NSOperations are completed

我的情况是:

我想做的是:

我问的是:

感谢任何帮助。

    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
    [operationQueue setMaxConcurrentOperationCount:2];

    for (User *user in users) {
        NSBlockOperation *operationObject = [NSBlockOperation blockOperationWithBlock:^{
            [user loadHistoryData:^{
                [NSNotificationCenter postNotificationToMainThread:@"oneUserFetchedHistory"];
            }];
        }];

        [operationQueue addOperation:operationObject];
    }

这个问题与这个 不同,因为我不想链接任何请求。我只想知道他们什么时候全部执行完。

这个answer只有一个操作队列的完成块。

answer 提供了一种方法,使操作块等待直到对 loadHistoryData 的异步调用完成。如写作 setSuspended

我找不到满足我需要的答案。有没有?

使用 KVO 观察队列的操作 属性,然后您可以通过检查 [queue.operations count] == 0 来判断队列是否已完成。

在文件的某处执行 KVO,像这样声明 KVO 的上下文 (more info):

我用过AsyncBlockOperation and NSOperationQueue+CompletionBlock

将它们结合起来对我来说是这样的:

  NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  [queue setMaxConcurrentOperationCount:1]; 
  // 1 is serial, more is concurrent

  queue.completionBlock = ^{
    [NSNotificationCenter postNotificationToMainThread:@"allUsersFetchedHistory"];
  };

  for (User *user in users){
   [queue addOperationWithAsyncBlock:^(AsyncBlockOperation *op) {
     [user loadHistoryData:^{
       [op complete];
       [NSNotificationCenter postNotificationToMainThread:@"oneUserFetchedHistory"];
      }];
    }];
  }