当我在 NSOperation 执行 performSelectorOnMainThread 时弹出导航控制器时应用程序崩溃
App crashes when I pop my navigation controller while NSOperation performs performSelectorOnMainThread
我正在按照 NSOperation 教程:http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues 在我自己的视图控制器的表视图中加载图像。在加载图像时,如果我从导航控制器中弹出视图控制器,应用程序会崩溃并显示错误:EXC_BAD_ACCESS 在线:
[(NSObject *)self.delegate performSelectorOnMainThread:@selector(imageDownloaderDidFinish:) withObject:self waitUntilDone:NO];
该行告诉我的委托(视图控制器)执行一个方法,但我已经弹出了我的视图控制器。我如何防止这种情况发生?我尝试在我的视图控制器的 viewDidUnload 中取消我的操作队列,但它不起作用。还尝试在执行该方法之前检查我的委托是否为 nil。任何帮助将不胜感激。
你如何弹出你的视图控制器?
为简单起见,我们将弹出视图控制器的方法命名为 pop
。
我会在 pop
中实现一些东西,在你实际弹出你在 NSOperation 上调用 cancel
的视图控制器之前(可能在这里显示加载微调器或叠加层)。然后等到 cancelled
和 finished
值为 true 而 executing
为 false(或者至少检查其中的一些并进行实验,看看哪些可以不检查)。
重要的是,在您添加到 NSOperation 的每个块中都有逻辑来检查 cancel
是否已被调用。但是,这很棘手,就好像你的块只是在开始时检查它是否应该取消它可能在那个时候继续进行。也许它然后继续执行一些异步任务,如果此时你调用 cancel
它不会做任何事情,因为你的块不再防止取消调用。
我的猜测是您正在调用 cancel
但实际上并没有等到操作消失、完成其 KVO 并取消所有操作。
我不确定你的问题是否纯粹是关于学习 NSOperation
但是,如果不是,AFAIK,AFNetworking 在所有这些方面都做得很好。特别是在异步加载 ImageViews 时(这就是该教程似乎涵盖了 NSOperation 的内容)。 AFNetworking 向 UIImageView
添加了一个名为 UIImageView+AFNetworking
的类别,它提供了一个名为 setImageWithURL:
的方法。这会处理所有这些类型的问题并提供缓存。安装AFNetworking,然后
#import "UIImageView+AFNetworking.h"
并致电
[self.imageView setImageWithURL:imageURL];
。
我知道最后一点并没有具体回答您的问题,但希望其余部分对您有所帮助。
我正在按照 NSOperation 教程:http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues 在我自己的视图控制器的表视图中加载图像。在加载图像时,如果我从导航控制器中弹出视图控制器,应用程序会崩溃并显示错误:EXC_BAD_ACCESS 在线:
[(NSObject *)self.delegate performSelectorOnMainThread:@selector(imageDownloaderDidFinish:) withObject:self waitUntilDone:NO];
该行告诉我的委托(视图控制器)执行一个方法,但我已经弹出了我的视图控制器。我如何防止这种情况发生?我尝试在我的视图控制器的 viewDidUnload 中取消我的操作队列,但它不起作用。还尝试在执行该方法之前检查我的委托是否为 nil。任何帮助将不胜感激。
你如何弹出你的视图控制器?
为简单起见,我们将弹出视图控制器的方法命名为 pop
。
我会在 pop
中实现一些东西,在你实际弹出你在 NSOperation 上调用 cancel
的视图控制器之前(可能在这里显示加载微调器或叠加层)。然后等到 cancelled
和 finished
值为 true 而 executing
为 false(或者至少检查其中的一些并进行实验,看看哪些可以不检查)。
重要的是,在您添加到 NSOperation 的每个块中都有逻辑来检查 cancel
是否已被调用。但是,这很棘手,就好像你的块只是在开始时检查它是否应该取消它可能在那个时候继续进行。也许它然后继续执行一些异步任务,如果此时你调用 cancel
它不会做任何事情,因为你的块不再防止取消调用。
我的猜测是您正在调用 cancel
但实际上并没有等到操作消失、完成其 KVO 并取消所有操作。
我不确定你的问题是否纯粹是关于学习 NSOperation
但是,如果不是,AFAIK,AFNetworking 在所有这些方面都做得很好。特别是在异步加载 ImageViews 时(这就是该教程似乎涵盖了 NSOperation 的内容)。 AFNetworking 向 UIImageView
添加了一个名为 UIImageView+AFNetworking
的类别,它提供了一个名为 setImageWithURL:
的方法。这会处理所有这些类型的问题并提供缓存。安装AFNetworking,然后
#import "UIImageView+AFNetworking.h"
并致电
[self.imageView setImageWithURL:imageURL];
。
我知道最后一点并没有具体回答您的问题,但希望其余部分对您有所帮助。