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

标签 ios objective-c nsoperationqueue nsoperation nsblockoperation

我的情况是:

  • 我有用户
  • 每个用户都有一些可以通过用户对象获取的历史数据

我想做的是:

  • 最多 2 个用户必须同时获取他们的历史数据(这就是我想使用 NSOperationQueue 的原因)
  • 我需要在任何用户完成获取其历史数据时得到通知
  • 我需要在每个用户完成获取他们的历史数据时得到通知

我要问的是:

  • 我无法通过下面的代码实现我想做的事情?

感谢任何帮助。

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

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

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

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

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

最佳答案

我用过 AsyncBlockOperationNSOperationQueue+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"];
      }];
    }];
  }

关于ios - 如何知道所有并发的 NSOperations 都完成了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47256724/

相关文章:

ios - 由于加载时崩溃,Apple 拒绝了我的应用程序,我无法重现它。我应该怎么办?

ios - 将 xcode 6.4 更新为 xcode 7 后出现此问题

iphone - 使用 NSOperationQueue 从 web 异步加载多个图像

ios - Swift - 使用 URL 打开谷歌地图

ios - Metal newBufferWithBytes 用法

ios - AWS SDK iOS - 如何确定上传请求的完成百分比

ios - 取消后 NSOperation 保留在 NSOperationQueue 中

ios - 实时文本识别 (OCR)

ios - 更改 MapKit 注释标注标题和副标题的字体

objective-c - NSOperationQueue 有储备能力吗?