Swift 操作队列停止操作一段时间
我使用swift 3.0.2。代码8.3.1 我尝试使用Swift 操作队列停止操作一段时间,swift,nsoperationqueue,Swift,Nsoperationqueue,我使用swift 3.0.2。代码8.3.1 我尝试使用issuspend=true属性,但它没有停止操作 当我取消一个操作1时,依赖于操作1的所有其他操作立即开始 我希望他们等到我告诉他们 请帮帮我 Edit1: 这意味着它不会停止操作: 我有操作队列oq和三个操作:op1,op2,op3 oq.addOperation(op1) op2.addDependency(op1) oq.addOperation(op2) op3.addDependency(op2) oq.addOperation
issuspend=true
属性,但它没有停止操作
当我取消一个操作1
时,依赖于操作1
的所有其他操作立即开始
我希望他们等到我告诉他们
请帮帮我
Edit1:
这意味着它不会停止操作:
我有操作队列oq
和三个操作:op1
,op2
,op3
oq.addOperation(op1)
op2.addDependency(op1)
oq.addOperation(op2)
op3.addDependency(op2)
oq.addOperation(op3)
所有三个操作都需要10秒才能执行
添加第三个操作后,我设置issspended=true
My log:
op1 started
(-- set `isSuspended` to true)
(after 10 seconds)
op2 started
(after 10 seconds)
op3 started
当我将issuspendend
设置为true时,我认为op1正在执行,这是正常的。但是为什么op2会启动
这是我的文件.swift
:
import Foundation
class PendingOps {
// lazy var downloadInProgress = [Int: Operation]()
// current tracklist
var downloadQueue: OperationQueue {
let queue = OperationQueue()
queue.qualityOfService = .background
queue.name = "Offline queue"
queue.maxConcurrentOperationCount = 1
return queue
}
}
class op: Operation {
var nam:String = ""
init(nam: String) {
self.nam = nam
}
override func main() {
print("\(self.nam) started");
sleep(10)
print("\(self.nam) ended");
}
}
这是ViewController的viewDidLoad()
函数:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let test = PendingOps()
let o1 = op(nam: "o1")
let o2 = op(nam: "o2")
o2.addDependency(o1)
let o3 = op(nam: "o3")
o3.addDependency(o2)
test.downloadQueue.addOperation(o1)
test.downloadQueue.isSuspended = true
print(test.downloadQueue.isSuspended)
test.downloadQueue.addOperation(o2)
test.downloadQueue.addOperation(o3)
}
您的计算属性
downloadQueue
在每次调用时创建一个独立队列。即,您正在挂起第一个创建的队列,但第二个和第三个队列不受影响
要修复此问题,请仅创建一次队列,可能在init()中创建一次
游乐场样本:
class PendingOps {
var downloadQueue: OperationQueue!
init() {
let queue = OperationQueue()
queue.qualityOfService = .background
queue.name = "Offline queue"
queue.maxConcurrentOperationCount = 1
downloadQueue = queue
}
}
class op: Operation {
var nam:String = "?"
init(nam: String) {
self.nam = nam
}
override func main() {
print("\(self.nam) started");
sleep(1)
print("\(self.nam) ended");
}
}
func didLoad() {
let test = PendingOps()
let o1 = op(nam: "o1")
let o2 = op(nam: "o2")
o2.addDependency(o1)
let o3 = op(nam: "o3")
o3.addDependency(o2)
test.downloadQueue.addOperation(o1)
test.downloadQueue.isSuspended = true
print(test.downloadQueue.isSuspended)
test.downloadQueue.addOperation(o2)
test.downloadQueue.addOperation(o3)
}
didLoad()
PlaygroundPage.current.needsIndefiniteExecution = true
印刷品:
o1 started
true
o1 ended
我认为isSupended
确实会停止队列以开始新的操作。已经运行的操作将继续,直到完成。如果您看到其他行为,请更详细地描述问题“它不会停止操作”。@shallow是的,我知道。我更新了问题。请你再看一次好吗?你能发布一份副本和过去的示例代码吗?@shallowthough我编辑了我的答案。请再看一遍好吗?非常感谢。我只是从一些教程中复制了这一部分,甚至没有想到问题就在那里。
o1 started
true
o1 ended