Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在异步任务中锁定和解锁调度队列_Swift_Grand Central Dispatch - Fatal编程技术网

Swift 在异步任务中锁定和解锁调度队列

Swift 在异步任务中锁定和解锁调度队列,swift,grand-central-dispatch,Swift,Grand Central Dispatch,我希望锁定LockQueue2以完成此过程,当解锁LockQueue2时,在dispatch\u中显示“number is:”number 我需要这个输出: 数字设置值1 数字是1 数字设置值2 数字是2 数字设置值3 号码是3 如果您正在处理简单的同步任务,就像您一样,您可以使用串行队列: let queue = DispatchQueue(label: "com.domain.app.serialqueue") var number = 0 func simpleSer

我希望锁定
LockQueue2
以完成此过程,当解锁
LockQueue2
时,在
dispatch\u中显示“number is:”
number

我需要这个输出:

数字设置值1
数字是1
数字设置值2
数字是2
数字设置值3
号码是3


如果您正在处理简单的同步任务,就像您一样,您可以使用串行队列:

let queue = DispatchQueue(label: "com.domain.app.serialqueue")
var number = 0

func simpleSerialQueue(_ num: Int) {
    queue.async { [self] in
        Thread.sleep(forTimeInterval: 2)
        number = num
        print("number set value: ", number)
    }

    queue.async { [self] in
        let value = number
        DispatchQueue.global(qos: .background).async {
            print("number is:", value) //*** show number set in last dispatch ***
        }
    }
}

simpleSerialQueue(1)
simpleSerialQueue(2)
simpleSerialQueue(3)
如您所见,我会让队列协调我的进程,避免使用信号量等,这很容易被误用并导致死锁

如果这些任务中的进程本身是异步的,那么它可能需要其他模式(组合、自定义异步
操作
子类等)。但对于这样的简单同步任务,串行调度队列就足够了



请参阅Swift 2格式副本的答案。

如果您希望某个随机线程上的进程等待另一个进程,您可能会使用信号量,而不是锁。所以,创建一个信号量,让第二个进程等待一个信号,然后让第一个进程发送该信号量。或者使用串行队列。谢谢亲爱的@Rob,你能给我一个例子吗?这是非常完整的答案,第2节解决了我的问题,非常感谢。
let queue = DispatchQueue(label: "com.domain.app.serialqueue")
var number = 0

func simpleSerialQueue(_ num: Int) {
    queue.async { [self] in
        Thread.sleep(forTimeInterval: 2)
        number = num
        print("number set value: ", number)
    }

    queue.async { [self] in
        let value = number
        DispatchQueue.global(qos: .background).async {
            print("number is:", value) //*** show number set in last dispatch ***
        }
    }
}

simpleSerialQueue(1)
simpleSerialQueue(2)
simpleSerialQueue(3)