gpt4 book ai didi

ios - NSOperation 没有被正确取消

转载 作者:行者123 更新时间:2023-11-28 23:14:28 24 4
gpt4 key购买 nike

我正在使用 NSOperation 执行一些繁重的数据解析,然后返回到主线程,其中的对象已准备好供我的应用程序使用。我通过将它们放在单例 NSOperationQueue 上来处理所有操作。我这样做是为了控制在任何时候发生的处理量,因为每个操作暂时使用相当高的内存占用。

所以,我有一个场景,我可以在屏幕上显示多个 View Controller 。每个 View Controller 都会在加载时创建一个解析操作并将其添加到队列中。我通过设置 maxConcurrentOperationCount 允许 2 个并发处理操作。每个 View Controller 创建一个处理操作,将其放在单例队列中,并将该操作作为属性保留,因此它有一个句柄。

如果 View Controller 需要离开以响应用户发起的删除操作,我在 View Controller 的 dealloc 方法中使用 NSOperation 属性来取消操作:

-(void)dealloc{
[self.currentOperation cancel];
[super dealloc];
}

在我的 NSOperation 子类中,我在几个地方检查了 isCancelled 属性(主要是在大量长时间运行的工作之前)isCancelled 属性并尝试响应它:

if([self isCancelled]){
// Perform cleanup
return;
}

问题是 isCancelled 属性评估为 false 并且操作继续,最终调用 Core Data 以尝试检索已删除的数据。即使我在核心数据获取请求之前立即放置 isCancelled 检查,我也会看到这种情况发生。

我有一个解决方法来防止应用程序崩溃,但我认为我的实现可能有误。有没有其他方法可以在处理过程中维护操作句柄,以便在需要时取消它?我的方法是否没有保留操作的正确句柄并阻止它被正确取消?

最佳答案

你不能在 dealloc 中做那样的逻辑。

首先dealloc最后一行必须调用super的dealloc。一旦完成,对象就消失了,所有后续的消息传递行为都是未定义的(将崩溃)。

队列也很可能会保留该操作,从而使 dealloc 中的取消变得毫无意义,因为在队列释放之前无法调用 dealloc(除非您的内存管理搞砸了)。

您需要将取消/失效逻辑与内存管理完全分开。

关于ios - NSOperation 没有被正确取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7012672/

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