【问题标题】:How to remove/cancel NSInvocationOperation from NSOperationQueue?如何从 NSOperationQueue 中删除/取消 NSInvocationOperation?
【发布时间】:2011-07-26 08:23:59
【问题描述】:

在维护 NSOperationQueue 和 NSInvocationOperation 的上下文中会询问以下两个问题。

由于我使用这个概念下载了多个视频,我如何在完成下载视频后从 NSOperationQueue 中删除/释放添加的 NSInvocationOperation?

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

【问题讨论】:

    标签: iphone multithreading nsoperationqueue nsinvocation


    【解决方案1】:

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

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

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

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

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

    这意味着,例如,您不能使用NSURLConnection-sendSynchronousRequest:returningResponse:error: 来获取数据,因为在所有数据都已经下载之后,它才能检查操作的取消状态。

    【讨论】:

    • 我已经实现了相同的逻辑,但由于 NSOperationQueue 的一些混乱,我缺少一点点。感谢 JeremyP 的描述性回复。它按照我的意愿完美运行。
    • 可以暂停视频的异步下载过程吗?
    • 我想您实际上想暂时断开连接。如果是这种情况,它可能取决于服务器。例如,HTTP/1.1 有一个 range 标头,允许客户端请求部分下载,但服务器不必实现执行此操作的逻辑。
    • 如何使我的服务器能够支持部分下载?或者服务器中的相同需要进行哪些修改?
    • @iApple:这取决于服务器。您可能会发现您的服务器已经支持范围标头。试试看。
    【解决方案2】:

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

    创建 NSOperation 的子类。为每个操作保留一个标识符。将所有操作存储在数组中。当您不想继续操作时,只需向操作发出取消消息,即[_operation cancel];

    【讨论】:

    • 感谢 Gomathi 的快速而有帮助的回复...:)
    • 但是如何让 NSInvocationOperation 对象提前取消?我知道我可以在操作对象上调用 -cancel 方法,但是如何获取对操作对象的引用,以便我可以拥有 if (myOperation.cancelled == true) then exit early
    猜你喜欢
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多