【发布时间】:2014-08-27 20:30:30
【问题描述】:
我需要一个带有<foo> 方法的类来执行后台任务。
这个<foo>方法从不同的线程被多次调用:每次调用这个方法,我需要停止之前分配的后台线程并启动一个新的,所以唯一有效的后台任务是最后创建的。
如何做到这一点?
谢谢
【问题讨论】:
标签: ios asynchronous cancellation
我需要一个带有<foo> 方法的类来执行后台任务。
这个<foo>方法从不同的线程被多次调用:每次调用这个方法,我需要停止之前分配的后台线程并启动一个新的,所以唯一有效的后台任务是最后创建的。
如何做到这一点?
谢谢
【问题讨论】:
标签: ios asynchronous cancellation
实现可取消操作的最佳方式是使用 NSOperation 和 NSOperationQueue。仔细阅读文档。要创建一个在取消时实际上停止做事的 NSOperation,NSOperation 执行的任务必须不时地实际检查它是否已被取消,然后停止做事。
你可能应该创建一个 NSOperation 的子类,实现“start”方法,覆盖“isFinished”方法,可能覆盖“cancel”方法或观察“isCancelled”属性,当你检测到操作被取消时,停止做事并以兼容 KVO 的方式更改 isFinished 属性(通常通过发送 willChangeValueForKey: 和 didChangeValueForKey]。
ASIHttpRequest 库就是做这种事情的,所以最好看看他们的源代码。
【讨论】:
您可以使用 NSOperation 类来取消您的操作。Refer
-(void)startMyOperation
{
//Cancel the existing operation
[self cancelOperation];
self.operation = [NSBlockOperation blockOperationWithBlock:^{
//your code to be done in the background
}];
}
-(void)cancelOperation
{
if(![self.operaion isFinished])
[self.operation cancel];
}
【讨论】: