- (void)cancel
官方文档:这个方法不强迫你操作代码直接停止。取而代之的,他更新对象内部的标志位(is cancle)反应改变在状态中。如果操作已经结束执行(is finshed)这个方法没有作用。取消当前存在在操作队列(queue)中的操作。但是尚未运行,这使他可以取消操作从队列中比通常早一些。
在操作系统OS X v10.6以后的系统,如果一些操作在队列中等待一个未完成的依赖操作,这些操作在随后就会被忽略。因为这一个操作已经被取消了,这个行为允许操作队列很快的调用这个操作的start方法在随后并将这个对象从队列中清除。如果你取消一个没在队列中的操作,这个方法马上标记这个对象结束(is finished)。在每一种情况下,标记对象为ready或者finished能导致在适当的情况产生KVO。
在版本10.6早些,一个操作对象保持在队列中直到所有他的依赖操作被进程移除。尽管如此,这个操作必须等待直到所有他的依赖操作结束运行或是他们自己被取消并调用start方法。
@property(readonly, getter=isCancelled) BOOL cancelled
这个属性默认值是NO,一旦设置为YES马上调用当前对象的cancle方法,一个操作必须被移到finished状态。
取消一个操作不会主动的停止接收者的代码从执行状态中。一个操作对象可靠的定期调用这个方法并且停止他自己如果方法返回YES(这意思是操作会安全的调用任务的取消,因为一些时间的取消会导致线程抛出异常程序出错)。
你应该在完成一个工作中的小任务中经常检查这个属性的值,这样往往意味着检查他再开始你自定义的main方法前。操作有可能被取消,但会在之后执行或是任何时间会被执行。因此,检查数值在开始你的main方法前是你尽可能快的退出当一个操作被取消的时候(响应更快)。
@property(readonly, getter=isFinished) BOOL finished
这个属性的值。如果当前线程主任务完成YES,如果在执行中或是还没开始执行那就是NO。
- (void)cancelAllOperations
这个方法将对所有的目前在队列中的操作调用cancel操作。
取消这些操作不会经他们自动的从队列中移除或者把正在执行的暂停。对于那些在队列中等待执行的操作,队列必须一致尝试执行操作在意识到他被取消前并且把他移动到finished状态。对于那些已经执行的操作,操作对象他自己必须监测取消状态并且停止所做的东西以至于他可以移动到终止状态。在这两种情况下,一个结束或者取消操作一致给机会执行他完成block在他移除队列之前。
总结:cancle方法会取消再任务队列中的未执行的任务。只要任务一运行就不能结束。对于那些已经执行的任务,你必须自己检测cancle属性并且手动停止任务。