ios - 当我在 NSOperation 执行 performSelectorOnMainThread 时弹出导航 Controller 时应用程序崩溃

标签 ios objective-c concurrency nsoperation performselector

我正在学习 NSOperation 教程:http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues在我自己的 View Controller 的 TableView 中加载图像。在加载图像时,如果我从导航 Controller 中弹出 View Controller ,应用程序会崩溃并显示错误:EXC_BAD_ACCESS 在线:

[(NSObject *)self.delegate performSelectorOnMainThread:@selector(imageDownloaderDidFinish:) withObject:self waitUntilDone:NO];

该行告诉我的委托(delegate)( View Controller )执行一个方法,但我已经弹出了我的 View Controller 。我如何防止这种情况发生?我尝试在我的 View Controller 的 viewDidUnload 中取消我的操作队列,但它不起作用。还尝试在执行该方法之前检查我的委托(delegate)是否为 nil。任何帮助将不胜感激。

最佳答案

你是如何弹出你的 View Controller 的?

为简单起见,我们将弹出 View Controller 的方法命名为pop

我会在 pop 中实现一些东西,在你实际弹出 View Controller 之前,你在 NSOperation 上调用 cancel (可能在这里显示加载微调器或覆盖)。然后等到 cancelledfinished 值为 true 并且 executing 为 false(或者至少检查其中的一些并进行实验,看看你选择了哪些可以逃脱不检查)。

重要的是,在您添加到 NSOperation 的每个 block 中都有逻辑来检查是否调用了 cancel。但是,这很棘手,就好像你的 block 只是在开始时检查它是否应该取消它可能在那个时候继续进行。也许它然后继续执行一些异步任务,如果此时你调用 cancel 它不会做任何事情,因为你的 block 不再防止取消调用。

我的猜测是您正在调用 cancel 但实际上并没有等到操作消失、完成其 KVO 并取消所有操作。

我不确定您的问题是否纯粹是为了学习 NSOperation,但如果不是,AFAIK,AFNetworking 在所有这些方面都做得很好。特别是在异步加载 ImageViews 时(这就是该教程似乎涵盖了 NSOperation 的内容)。 AFNetworking 向 UIImageView 添加了一个名为 UIImageView+AFNetworking 的类别,它提供了一个名为 setImageWithURL: 的方法.这会处理所有这些类型的问题并提供缓存。安装 AFNetworking,然后

#import "UIImageView+AFNetworking.h"

然后打电话

[self.imageView setImageWithURL:imageURL];

我知道这最后一点并没有具体回答您的问题,但希望其余部分对您有所帮助。

关于ios - 当我在 NSOperation 执行 performSelectorOnMainThread 时弹出导航 Controller 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33744029/

相关文章:

ios - 打开模块 'Swift' 的导入文件

iPhone - 这个屏幕是否可用和可定制,还是我需要从头开始创建它?

ios - 在 .xib 上制作 UIImageView 全屏

ios - 如果来自 UIViewController 的对象如何仅获取我创建的自定义属性的名称(在运行时)?

Java 线程跳跃或线程间通信

iphone - 如何检查 iPhone 应用程序的 Web 服务请求的详细信息?

ios - 导航栏 Swift 中的文本颜色

ios - iOS 应用程序可以动态扩展到的大小限制?

c# - 如何正确处理并发异常并通过服务堆栈公开?

java并发实践14.6