gpt4 book ai didi

iphone - 当 NSOperationQueue 完成所有任务时获取通知

转载 作者:行者123 更新时间:2023-12-03 18:08:32 25 4
gpt4 key购买 nike

NSOperationQueuewaitUntilAllOperationsAreFinished,但我不想同步等待它。我只想在队列完成时隐藏 UI 中的进度指示器。

实现这一目标的最佳方法是什么?

我无法从我的 NSOperation 发送通知,因为我不知道哪一个将是最后一个,并且 [队列操作] 可能不会收到通知时还为空(或更糟 - 重新填充)。

最佳答案

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

在要执行 KVO 的文件中的某个位置,为 KVO 声明一个上下文,如下所示 ( more info ):

static NSString *kQueueOperationsChanged = @"kQueueOperationsChanged";

当您设置队列时,请执行以下操作:

[self.queue addObserver:self forKeyPath:@"operations" options:0 context:&kQueueOperationsChanged];

然后在您的observeValueForKeyPath中执行此操作:

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context
{
if (object == self.queue && [keyPath isEqualToString:@"operations"] && context == &kQueueOperationsChanged) {
if ([self.queue.operations count] == 0) {
// Do something here when your queue has completed
NSLog(@"queue has completed");
}
}
else {
[super observeValueForKeyPath:keyPath ofObject:object
change:change context:context];
}
}

(假设您的 NSOperationQueue 位于名为 queue 的属性中)

在对象完全释放之前的某个时刻(或者当它停止关心队列状态时),您需要像这样从 KVO 取消注册:

[self.queue removeObserver:self forKeyPath:@"operations" context:&kQueueOperationsChanged];


附录:iOS 4.0 有一个 NSOperationQueue.operationCount 属性,根据文档,该属性符合 KVO 规范。然而,这个答案在 iOS 4.0 中仍然有效,因此它对于向后兼容性仍然有用。

关于iphone - 当 NSOperationQueue 完成所有任务时获取通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1049001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com