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

前端之家收集整理的这篇文章主要介绍了ios – 我可以使用addOperationWithBlock取消添加到NSOperationQueue的块吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我读了很多文章说“块是未来!!!”.我想知道它是否与后台运行操作有关.

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

解决方法

问题似乎是您是否可以创建可取消的NSBlockOperation.正如 this answer所说,从 WWDC 2012 session #211,Building Concurrent User Interfaces引用,你当然可以.

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

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

如果您想进行可取消的网络操作,那么NSOperation子类将是一种更加优雅的方式.第一次这样做,它看起来很麻烦,但是一旦你熟悉了这个模式,它就变成了第二个本质而且很容易实现.你会发现自己一次又一次地回到这种模式.有关进行可取消的并发操作的讨论,请参阅“并发编程指南”的“操作队列”一章的Defining a Custom Operation Object部分,特别是关于“响应取消事件”的讨论.

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

猜你在找的iOS相关文章