2011-07-26 39 views
3

为了维护NSOperationQueue和NSInvocationOperation,上下文中都要求提出以下两个问题。如何从NSOperationQueue中删除/取消NSInvocationOperation?

正如我已经使用这个概念下载多个视频,我如何删除/释放完成下载视频后添加NSOvrationQueue的NSInvocationOperation?

而且,如果我想要在下载过程中停止下载特定视频,该怎么办?

回答

5

如何删除/释放下载视频完成后从NSOperationQueue添加NSInvocationOperation?

该操作在完成时自动从队列中删除,即 - isFinished返回true时。

而且,如果我想在下载过程中停止下载特定视频时该怎么办?

当您想要中途停止某项操作时,必须将其发送给-cancel消息。 但是这不会神奇地停止运行的操作。你的任务需要定期检查它是否被取消,如果事实证明它已经完成了,那么它就完成了。因此,您需要分块下载视频,并在每个块后检查操作的取消状态。下面的伪代码可能会有所帮助:

while (![myOperation isCancelled] && thereIsMoreData) 
{ 
    download a chunk of data and save it 
} 

这意味着,例如,你不能用NSURLConnection-sendSynchronousRequest:returningResponse:error:来获取数据,因为它不能够检查操作的取消状态,直到毕竟数据已经下载。

+0

我已经实现了相同的逻辑,但由于NSOperationQueue的混淆,我缺乏一点点。感谢JeremyP的描述性答复。它的工作完美,因为我想。 –

+0

我可以暂停视频的异步下载过程吗? –

+0

我认为你真的想放弃一段时间的连接。如果是这样的话,它可能取决于服务器。例如,HTTP/1.1有一个'range'头,它允许客户端请求部分下载,但是服务器不需要实现这个逻辑。 – JeremyP

1

在NSOperation完成该任务后,它将自动从队列中删除。参考号link

制作NSOperation的子类。为每个操作保留一个标识符。将所有操作存储在数组中。当U不想操作继续,只是给取消消息的操作,即,[_operation cancel];

+0

感谢Gomathi为您的快速和有益的回复... :) –

+0

但我如何获得NSInvocationOperation对象提前取消?我知道我可以在操作对象上调用-cancel方法,但是如何获得对操作对象的引用,以便我可以使用'if(myOperation.cancelled == true)然后退出早期'? –

相关问题