swift之GCD的DispatchGroup

把一个task加入一个DispatchGroup有两种方式

方式一: 通过enter()和leave()

let group = DispatchGroup()
let queue1 = DispatchQueue(label: "com.1")
let queue2 = DispatchQueue(label: "com.2")
let queue3 = DispatchQueue(label: "com.3")

group.enter()
queue1.async(){
    for i in 0...10{
        print("i = \(i)",Thread.current)
    }
    group.leave()
}

group.enter()
queue2.async(){
    for j in 11...20{
        print("j = \(j)",Thread.current)
    }
    group.leave()
}

group.enter()
queue3.async(){
    for n in 21...30{
        print("n = \(n)",Thread.current)
    }
    group.leave()
}

group.notify(queue: .main){
    print("ok")
}

方法二:直接吧task加入到group

let group = DispatchGroup()
let queue1 = DispatchQueue(label: "com.1")
let queue2 = DispatchQueue(label: "com.2")
let queue3 = DispatchQueue(label: "com.3")

queue1.async(group: group){
    for i in 0...10{
        print("i = \(i)",Thread.current)
    }
}

queue2.async(group: group){
    for j in 11...20{
        print("j = \(j)",Thread.current)
    }
}

queue3.async(group: group){
    for n in 21...30{
        print("n = \(n)",Thread.current)
    }
}

group.notify(queue: .main){
    print("ok")
}

上面的task全是异步并发执行的,如果想让上面的代码顺序执行怎么办?加入信号量机制即可

let group = DispatchGroup()
let queue1 = DispatchQueue(label: "com.1")
let queue2 = DispatchQueue(label: "com.2")
let queue3 = DispatchQueue(label: "com.3")
let semaphore = DispatchSemaphore(value: 1)
semaphore.wait()
queue1.async(group: group){
    for i in 0...10{
        print("i = \(i)",Thread.current)
    }
    group.leave()
}
semaphore.wait()
queue2.async(group: group){
    for j in 11...20{
        print("j = \(j)",Thread.current)
    }
    group.leave()
}
semaphore.wait()
queue3.async(group: group){
    for n in 21...30{
        print("n = \(n)",Thread.current)
    }
    group.leave()
}

group.notify(queue: .main){
    print("ok")
}

semaphore.wait()是先把信号semaphore的值减1,然后在于0比较,如果大于等于0,则执行任务,如果小于0则把任务挂起,当信号量大于等于0的时候在唤醒执行任务。如果还有不理解的,请参考《计算机操作系统》这本书。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swift DispatchGroup is a class in the Swift programming language that allows you to synchronize the execution of multiple tasks running on different threads. It helps you to manage the timing of asynchronous operations and avoid race conditions. A DispatchGroup is a lightweight mechanism for tracking a group of tasks. You can add tasks to a group, and the group will notify you when all of the tasks have completed. You can also specify a timeout for the group, after which the group will notify you if any of the tasks have not completed. Here is an example of how to use a DispatchGroup: ``` let group = DispatchGroup() group.enter() // run task 1 group.leave() group.enter() // run task 2 group.leave() group.notify(queue: .main) { // both tasks have completed } ``` In this example, we create a DispatchGroup called `group`. We then use the `enter()` and `leave()` methods to add two tasks to the group. The `notify()` method is called when both tasks have completed, and we can then perform any necessary actions. You can also use a DispatchGroup to wait for a group of tasks to complete before continuing execution. Here's an example: ``` let group = DispatchGroup() group.enter() // run task 1 group.leave() group.enter() // run task 2 group.leave() group.wait() // both tasks have completed ``` In this example, we use the `wait()` method to wait for both tasks to complete before continuing execution. This can be useful if you need to ensure that all tasks have completed before performing additional actions.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值