OC版本:http://www.lxweimin.com/p/25b59832b302
一丶介紹
目錄:
1.多個網(wǎng)絡(luò)請求并發(fā)處理
2.分線程/主線程通訊
3.延遲執(zhí)行
4.隊列組的使用
5.信號量
官方api
二丶代碼
1.多個網(wǎng)絡(luò)請求并發(fā)處理;
//1.多個網(wǎng)絡(luò)請求并發(fā)處理;
let dispatchGroup = DispatchGroup.init()
//延遲執(zhí)行
let delay = DispatchTime.now() + .seconds(1);
print("準(zhǔn)備做第一件事");
dispatchGroup.enter();
DispatchQueue.main.asyncAfter(deadline: delay) {
print("延遲1秒做的事情結(jié)束");
dispatchGroup.leave();
}
//延遲執(zhí)行
let delay2 = DispatchTime.now() + .seconds(3);
print("準(zhǔn)備做第二件事");
dispatchGroup.enter();
DispatchQueue.main.asyncAfter(deadline: delay2) {
print("延遲3秒做的事情結(jié)束");
dispatchGroup.leave();
}
dispatchGroup.notify(queue: DispatchQueue.main) {
print("全部完成");
}
2分線程/主線程通訊
//2分線程/主線程通訊
DispatchQueue.global().async {
DispatchQueue.main.async {
}
}
3.延遲執(zhí)行
//3延遲執(zhí)行
let delay = DispatchTime.now() + .seconds(3);
print("開始");
DispatchQueue.main.asyncAfter(deadline: delay) {
print("結(jié)束");
}
4.隊列組的使用
//4,隊列組的使用
let group = DispatchGroup.init();
let queue1 = DispatchQueue.init(label: "Queue")
//組,優(yōu)先級,
queue1.async(group: group, qos: .default, flags: .barrier, execute: {
for _ in 0...5 {
print(" Q1____> \(Thread.current)")
}
})
queue1.async(group: group, qos: .default, flags: .barrier, execute: {
for _ in 0...3 {
print(" Q2____> \(Thread.current)")
}
})
queue1.async(group: group, qos: .default, flags: .barrier, execute: {
for _ in 0...4 {
print(" Q3____> \(Thread.current)")
}
})
group.notify(queue: queue1) {
print(" 完成__> \(Thread.current)")
}
5.信號量
//5信號量
let singnal = DispatchSemaphore.init(value: 1);
//-1
singnal.wait();
//+1
singnal.signal();
例子:
所有線程都必須做一件事情,只要有1個線程做完,其他線程就不用做的情景:
var _count :Int = 0
var _signal: DispatchSemaphore = DispatchSemaphore.init(value: 1)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
/*
三個線程同時處理xzb()
*/
_count = 0;
for var index in 0...3 {
index += 1
DispatchQueue.global().async {
self.xzb(name: "\(index)")
}
}
}
// 如果 count < 10 則讓 count 累加且只能有一個線程做,如果有一個線程去做累加,其他線程則等待;
func xzb(name: String) -> () {
print("準(zhǔn)備開始-->" + name)
_signal.wait();
if _count < 10 {
for _ in 0...10 {
_count += 1
print(_count)
}
}
_signal.signal();
print("結(jié)束")
}
日志:
準(zhǔn)備開始-->1
準(zhǔn)備開始-->4
準(zhǔn)備開始-->2
準(zhǔn)備開始-->3
1
2
3
4
5
6
7
8
9
10
11
結(jié)束
結(jié)束
結(jié)束
結(jié)束
三丶擴(kuò)展
qos:線程優(yōu)先級
和原有的對應(yīng)關(guān)系是:
* DISPATCH_QUEUE_PRIORITY_HIGH: .userInitiated
* DISPATCH_QUEUE_PRIORITY_DEFAULT: .default
* DISPATCH_QUEUE_PRIORITY_LOW: .utility
* DISPATCH_QUEUE_PRIORITY_BACKGROUND: .background
flags:
原文
DispatchWorkItemFlags
DispatchWorkItemFlags are an option set that configure the
behavior of a DispatchWorkItem value, including its quality of
service class and whether to create a barrier or spawn a new
detached thread.
創(chuàng)建一個屏障或者新的獨(dú)立線程?聽不懂看個例子:
barrier
假設(shè)我們有一個并發(fā)的隊列用來讀寫一個數(shù)據(jù)對象。如果這個隊列里
的操作是讀的,那么可以多個同時進(jìn)行。如果有寫的操作,則必須保
證在執(zhí)行寫入操作時,不會有讀取操作在執(zhí)行,必須等待寫入完成后
才能讀取,否則就可能會出現(xiàn)讀到的數(shù)據(jù)不對。
__例子選自網(wǎng)友[不滅的小燈燈]的文章;
四丶總結(jié)
真是任性,api樣子變動太大了,一些api都廢棄掉了;
看我表情:
![]G(9J4XSDVSFB%@F(TZ38FX.gif](http://upload-images.jianshu.io/upload_images/1986326-7a2dbb1901d8e232.gif?imageMogr2/auto-orient/strip)