当我弹出导航控制器而NSOperation执行performSelectorOnMainThread时,应用程序崩溃

时间:2015-11-16 20:28:51

标签: ios objective-c concurrency nsoperation performselector

我正在按照NSOperation教程:http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues在我自己的视图控制器的tableview中加载图像。在加载图像时,如果我从导航控制器弹出视图控制器,应用程序崩溃时会出现错误:EXC_BAD_ACCESS:

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

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

1 个答案:

答案 0 :(得分:1)

你是如何弹出视图控制器的?

为简单起见,我们将弹出视图控制器pop的方法命名为。

我会在pop中实现一些内容,在你实际弹出视图控制器之前,你在你的NSOperation上调用cancel(也许在这里显示一个加载微调器或一个叠加层)。然后等到cancelledfinished值为真且executing为假(或者至少检查其中的一些并尝试查看哪些可以通过不检查而逃脱)。< / p>

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

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

我不确定你的问题是否纯粹是在考虑学习NSOperation,但如果不是AFAIK,AFNetworking在所有这些方面做得很好。特别是在异步加载ImageViews时(这个教程似乎覆盖了NSOperation的东西)。 AFNetworking向名为UIImageView的{​​{1}}添加了一个类别,该类别提供了一种名为setImageWithURL:的方法。这可以解决所有这些问题并提供缓存。安装AFNetworking,然后

UIImageView+AFNetworking

并致电

#import "UIImageView+AFNetworking.h"

我知道最后一点并没有具体回答你的问题,但希望其余的有帮助。