例如,我有一个表视图,其中包含来自Web的图像.现在我可以使用[NSOperationQueue addOperationWithBlock:]来获取它们.当单元格变为可见时,操作将被发送到队列.但有一种方法可以在单元格从屏幕滚动后取消它吗?或者是NASSperation的子类化的唯一方法?使用块是如此简单,所以在我尝试解决this example的NSOperation子类之前,我只是问这个问题…
解决方法
但是,这种方法包含限制.值得注意的是,您必须将取消逻辑放在块中.如果您的块正在运行某个循环,它可以重复检查isCancelled状态,这可以正常工作.但是,如果您正处于某个网络请求的中间,那么在NSBlockOperation中执行这将很难.
使用其他答案(以及WWDC 2012视频)中概述的模式,您可以编写一个NSBlockOperation,它使用基于块的NSURLSession和轮询循环的折叠组合,如果操作被取消,则取消NSURLSessionTask,从而实现您的意图,但这是一个可怕的解决方案(低效,繁琐,使用块中的取消逻辑来阻碍您的应用程序代码等).
如果您想进行可取消的网络操作,那么NSOperation子类将是一种更加优雅的方式.第一次这样做,它看起来很麻烦,但是一旦你熟悉了这个模式,它就变成了第二个本质而且很容易实现.你会发现自己一次又一次地回到这种模式.有关进行可取消的并发操作的讨论,请参阅“并发编程指南”的“操作队列”一章的Defining a Custom Operation Object部分,特别是关于“响应取消事件”的讨论.
作为最后的观察,您将此“使用块”和NSOperation-子类描述为“任一/或”命题.但是,实际上,您实际上要将这两种技术结合起来,创建一个NSOperation子类,该子类使用块参数来指定下载完成后要执行的操作.请参阅AFNetworking,作为如何结合块和NSOperation子类的一个很好的例子.