如何在NSOperationQueue中暂停NSOperation?

时间:2012-08-16 08:50:26

标签: ios macos cocoa nsoperation nsoperationqueue

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

3 个答案:

答案 0 :(得分:12)

请参阅:Link

此处来自apple docs

  

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

     

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分: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