18

我需要暂停一个插入到 NSOperationQueue 中的正在运行的 NSOperation。目前我正在取消所有操作并重新启动它们。但这会导致在完成的​​过程方面出现某种重复。我尝试使用 NSOperationQueue 的 setSuspended 标志。但这并没有暂停操作。有什么出路吗?

4

3 回答 3

13

看到这个:链接

这里来自苹果文档

挂起和恢复队列 如果要暂时停止操作的执行,可以使用 setSuspended: 方法挂起相应的操作队列。

暂停队列不会导致已经执行的操作在其任务中间暂停。它只是防止新操作被安排执行。您可能会暂停队列以响应用户暂停任何正在进行的工作的请求,因为期望用户最终可能希望恢复该工作。

于 2012-08-16T09:06:31.697 回答
3

我没有尝试过,但我可能会从这里开始:

  • 为您的子类添加isPaused标志NSOperation
  • 实现操作数据的复制/移动方法
  • 如果暂停,setCancelled:(注意这个变化-main
  • 创建一个新操作,将状态从暂停操作移动到新操作
  • 调整优先级以重新排序队列中的操作顺序,如果你喜欢
  • 将克隆添加到队列中
  • -main如果在返回-main

请注意,这只会暂停它。如果您真的想暂停并明确恢复,您可以在要恢复时手动“新操作”。

现在,如果您正在观察或有特殊的完成,那么您将遇到一些其他问题。对于简单的情况,这种方法似乎可以正常工作。

于 2012-08-16T10:03:49.627 回答
0

在 Swift 5 中,您可以使用 isSuspended 属性来暂停和恢复您的 OperationQueue,您可以查看示例以获得更多理解:-

let operationQueue = OperationQueue()

let op1 = BlockOperation {
    print("done")
}
let op2 = BlockOperation {
    print("op2")
}
let op3 = BlockOperation {
    print("op3")
}

op1.addDependency(op2)
operationQueue.addOperations([op1, op2, op3], waitUntilFinished: false)

operationQueue.isSuspended = true
print("operationQueue suspended")

if operationQueue.isSuspended {
    operationQueue.isSuspended = false
    print("operationQueue restarted")
}


OutPut:- 
op2
op3
operationQueue suspended
operationQueue restarted
done
于 2020-07-16T07:52:49.247 回答