GCD
在iOS多線程編程中,可以通過官方API,可以自己創(chuàng)建管理線程搜骡,但是用GCD是最直觀簡單高效地使用多線程編程。想要用好GCD佑女,必須清楚理解概念记靡,其中有兩個很重要的概念,隊列和同步性
隊列
GCD中的隊列是FIFO团驱,把需要執(zhí)行的任務(wù)以先進(jìn)先出的順序加入隊列中摸吠。
GCD中有兩種隊列,分別是串行隊列以及并行隊列嚎花。
串行隊列:按任務(wù)加入的順序在一個線程內(nèi)線性執(zhí)行寸痢。
// Swift
// 第一種方式
let queue = DispatchQueue(label: "hwhQuene1") //表示串行隊列
// 第二種方式
let queue = DispatchQueue.main // 因為加入主隊列的任務(wù)只在主線程中執(zhí)行,所以是主隊列是串行隊列
// OC
// 第一種方式
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL);
// 第二種方式
dispatch_queue_t mainQueue = dispatch_get_main_queue();
并行隊列:按任務(wù)加入的順序在多個線程內(nèi)并發(fā)執(zhí)行紊选。
// swift
// 第一種方式 自己創(chuàng)建一個并行隊列
let queue = DispatchQueue(label: "net.bujige.testQueue", attributes: .concurrent) //并行隊列
// 第二種方式 全局隊列啼止,可指定優(yōu)先級
let globalQuene = DispatchQueue.global(qos: .default)
// OC
// 第一種方式
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUQUE_CONCURRENT);
// 第二種方式
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
同步性
同步執(zhí)行:sync函數(shù)會等待里面的處理執(zhí)行結(jié)束后才能返回結(jié)果道逗。即sync函數(shù)將指定的任務(wù)"同步"追加到指定的隊列中,在追加任務(wù)結(jié)束之前献烦,sync函數(shù)會一直等待滓窍。
// Swift
queue.sync {
// 添加要執(zhí)行的任務(wù)
}
// OC
dispatch_sync(queue, ^{
// 添加要執(zhí)行的任務(wù)
});
異步執(zhí)行:async函數(shù)會等待里面的處理執(zhí)行結(jié)束后才能返回結(jié)果。即async函數(shù)將指定的任務(wù)"非同步"追加到指定的隊列中巩那,async函數(shù)不做任何等待吏夯,一直往下執(zhí)行。
// Swift
queue.async {
// 添加要執(zhí)行的任務(wù)
}
// OC
dispatch_async(queue, ^{
// 添加要執(zhí)行的任務(wù)
});
串行隊列+同步執(zhí)行
串行隊列會把加入隊列中的任務(wù)加入到當(dāng)前執(zhí)行環(huán)境的線程中拢操。如果在當(dāng)前執(zhí)行環(huán)境為主線程锦亦,則把任務(wù)加入主線程中線性執(zhí)行,如果在其他線程中令境,則把任務(wù)加入到其他線程中線性執(zhí)行。
// 在主線程中執(zhí)行
func doInMain() {
print(Thread.current)
kSserialQueueSync()
}
// 在其他線程中執(zhí)行
func doInOther() {
let serQueue = DispatchQueue(label: "otherQueue")
serQueue.async {
print(Thread.current)
self.kSserialQueueSync()
}
}
// 串行 同步
func kSserialQueueSync() {
print("test start")
let serQueue = DispatchQueue(label: "serQueue") //串行
serQueue.sync {
print("block1")
print(Thread.current)
}
serQueue.sync {
print("block2")
print(Thread.current)
}
serQueue.sync {
print("block3")
print(Thread.current)
}
print("test over")
}
參考鏈接
Swift
OC
GCD的Dispatch Queue(串行隊列顾瞪、并發(fā)隊列舔庶、主隊列)
iOS 多線程:『GCD』詳盡總結(jié)
iOS 從一個問題開始說說多線程+死鎖(同步函數(shù)底層)
后續(xù)添加
同步性+隊列 (4種)
GCD其他重要API
信號量的簡單使用
遺留問題
在主線程執(zhí)行環(huán)境下,同步的添加任務(wù)到主隊列下陈醒,會發(fā)生死鎖
在A線程執(zhí)行環(huán)境下惕橙,同步的添加任務(wù)到A隊列下,會發(fā)生死鎖钉跷。A線程是A隊列生成用來執(zhí)行A隊列里面的任務(wù)的線程弥鹦。