【问题标题】:How to know all concurrent NSOperations are completed如何知道所有并发的NSOperations都完成了
【发布时间】:2017-11-13 03:34:50
【问题描述】:

我的情况是:

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

我想做的是:

  • 最多 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只有一个操作队列的完成块。

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

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

【问题讨论】:

标签: ios objective-c nsoperationqueue nsoperation nsblockoperation


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多