如何知道所有并发的NSOperations已经完成

时间:2017-11-13 03:34:50

标签: 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只有一个操作队列的完成块。

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

我无法找到满足我需求的答案。有没有?

2 个答案:

答案 0 :(得分:1)

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

文件中的某处执行KVO,为此类(more info)声明KVO的上下文:

答案 1 :(得分:0)

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