iOS线程之间的通讯(3种)

261 阅读1分钟

以下为个人理解的线程之间的通讯方式

这里随便创建一个下面公用的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线程组处理完任务后的通知}