以下为个人理解的线程之间的通讯方式
这里随便创建一个下面公用的queue
let label = "com.GCDTest2.queue.concurrent"
let GCDQueue = DispatchQueue.init(label: label, qos: .background, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
1.DispatchSemaphore
let Semaphore = DispatchSemaphore.init(value: 0)
GCDQueue.async {
print("stary--1")
sleep(3)
print("end--1")
Semaphore.signal()
}
GCDQueue.async {
print("stary--2")
sleep(4)
print("end--2")
Semaphore.signal()
}
GCDQueue.async {
print("stary--3")
sleep(3) print("end--3")
Semaphore.signal()
}
Semaphore.wait()
Semaphore.wait()
Semaphore.wait()
GCDQueue.async {
print("stary--4刷新UI")
sleep(4)
print("end--4刷新UI")
}
GCDQueue.async {
print("stary--5")
sleep(3)
print("end--5")
}
print("reqEnd")
控制台输出
stary--1
stary--2
stary--3
end--1
end--3
end--2
reqEnd
stary--4刷新UI
stary--5
end--5
end--4刷新UI
2.barrier & 3.DispatchGroup
下面使用了两种同步方式一种 barrier 一种 DispatchGroup的notify
let group = DispatchGroup.init()
GCDQueue.async(group: group, qos: .background, flags: .detached) {
print("开始处理任务2")
sleep(6)
print("结束处理任务2")
}
GCDQueue.async(group: group, qos: .background, flags: .detached) {
print("开始处理任务2.1")
sleep(6)
print("结束处理任务2.1")
}
GCDQueue.async(group: group, qos: .background, flags: .barrier) {
print("开始处理barrier任务")
sleep(5)
print("结束处理barrier任务") }
GCDQueue.async(group: group, qos: .background, flags: .detached) {
print("开始处理任务3")
sleep(3)
print("结束处理任务3")
}
group.notify(queue: GCDQueue) {
print("线程组处理完任务后的通知")
}
输入:开始处理任务2开始处理任务2.1结束处理任务2结束处理任务2.1开始处理barrier任务结束处理barrier任务开始处理任务3结束处理任务3线程组处理完任务后的通知}