我可以使用addOperationWithBlock取消添加到NSOperationQueue的块吗?

den*_*kov 6 cocoa-touch nsoperation nsoperationqueue ios objective-c-blocks

我读了很多文章说"块是未来!!!".我想知道它是否与后台运行操作有关.

例如,我有一个表视图,其中包含来自Web的图像.现在我可以使用它们+[NSOperationQueue addOperationWithBlock:].当单元格变为可见时,操作将被发送到队列.但是有一种方法可以在单元格从屏幕滚动后取消它吗?或者是进行子类化的唯一方法NSOperation?使用块是很容易的,所以我只是提出这个问题之前,我试图解决这个例子中NSOperation子类...

Rob*_*Rob 11

问题似乎是您是否可以创建可取消的NSBlockOperation.正如这个答案所暗示的,引用WWDC 2012会话#211,构建并发用户界面,你当然可以.

但是,这种方法包含限制.值得注意的是,您必须将取消逻辑放在块中.如果您的块正在运行某个循环,它可以重复检查isCancelled状态,这可以正常工作.但是如果你正处于一些网络请求的中间,那么在一个网络中执行就会很尴尬NSBlockOperation.

使用其他答案(以及WWDC 2012视频)中概述的模式,您可以编写一个NSBlockOperation使用基于块NSURLSession的轮询和轮询循环的折叠组合,取消NSURLSessionTask操作被取消的操作,从而实现您的意图,但它是一个可怕的解决方案(低效,繁琐,使用块中的取消逻辑来阻止您的应用程序代码等).

如果要进行可取消的网络操作,NSOperation子类将是一种更优雅的方法.第一次这样做,它看起来很麻烦,但是一旦你熟悉了这个模式,它就变成了第二个本质而且很容易实现.你会发现自己一次又一次地回到这种模式.有关进行可取消的并发操作的讨论,请参阅" 并发编程指南"的" 操作队列"一章中的" 定义自定义操作对象"一节,特别是关于"响应取消事件"的讨论.

作为最后的观察,你将这个"使用块"和 - NSOperation子类描述为"或/或"命题.但是,通常,您实际上将这两种技术结合起来,创建一个NSOperation子类,该子类采用块参数来指定下载完成后您要执行的操作.请参阅AFNetworking,作为如何结合块和NSOperation子类的一个很好的例子.