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
子类的一个很好的例子.
归档时间: |
|
查看次数: |
6751 次 |
最近记录: |