如何知道所有并发的 NSOperations 都完成了
How to know all concurrent NSOperations are completed
我的情况是:
- 我有用户
- 每个用户都有一些可以通过用户对象获取的历史数据
我想做的是:
- 最多 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];
}
这个问题与这个 不同,因为我不想链接任何请求。我只想知道他们什么时候全部执行完。
这个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"];
}];
}];
}
我的情况是:
- 我有用户
- 每个用户都有一些可以通过用户对象获取的历史数据
我想做的是:
- 最多 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];
}
这个问题与这个
这个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"];
}];
}];
}