1

我的情况是:

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

我想做的是:

  • 最多 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];
    }

这个问题与这个问题不同我不想链接任何请求。我只想知道他们什么时候都完成了执行。

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

这个答案提供了一种让操作阻塞等到异步调用的方法loadHistoryData完成的方法。作为写作setSuspended

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

4

2 回答 2

1

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

在文件中的某处执行 KVO,像这样声明 KVO 的上下文(更多信息)

于 2017-11-13T05:27:40.723 回答
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"];
      }];
    }];
  }
于 2017-11-13T23:12:16.620 回答