Swift 操作队列停止操作一段时间

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

我使用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(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