##GCD簡單介紹
1饵沧、Dispatch Semaphores:信號量孕荠,可以讓我們實現(xiàn)更加復(fù)雜的并發(fā)控制,防止資源競爭
2牙瓢、三種隊列的獲取方式
串行隊列:系統(tǒng)默認(rèn)并不提供串行隊列毡代,需要我們手動創(chuàng)建
let queue = DispatchQueue(label: "serialQueue")
并行隊列:這里只討論系統(tǒng)提供的全局隊列阅羹。在 iOS >= 8 之后,優(yōu)先級的概念被蘋果使用 QoS 替代了月趟,我們不再使用優(yōu)先級灯蝴,而是使用 QoS 來描述全局隊列。我們將 QoS 傳入 global() 方法孝宗,實際上就像指定它的優(yōu)先級穷躁。當(dāng)然你也可以不指定,默認(rèn)就是 default因妇。
主隊列:請避免在主線程指定同步任務(wù)问潭,否則你的主線程可能會鎖死
3、我們自己創(chuàng)建的隊列與系統(tǒng)隊列有什么不同婚被?
事實上狡忙,我們自己創(chuàng)建的隊列,最終會把任務(wù)分配到系統(tǒng)提供的主隊列和四個全局的并行隊列中址芯,這種操作叫做Target queues灾茁。具體說窜觉,我們創(chuàng)建的串行隊列的target queue就是系統(tǒng)的主隊列,我們創(chuàng)建的并行隊列的target queue默認(rèn)是系統(tǒng)default優(yōu)先級的全局并行隊列北专。所有放在我們創(chuàng)建的隊列中的任務(wù)禀挫,最終都會到target queue中完成真正的執(zhí)行。那豈不是自己創(chuàng)建對列就沒什么意義了拓颓? 其實不是的语婴,通過我們自己創(chuàng)建的隊列,以及dispatch_set_target_queue 和 barrier 等操作驶睦,可以實現(xiàn)比較復(fù)雜的任務(wù)之間的同步砰左。
4、同步和異步添加任務(wù)场航,與隊列是串行隊列還是并行隊列沒有關(guān)系缠导。可以同步地給并行隊列添加任務(wù)旗闽,也可以異步地給串行隊列添加任務(wù)酬核。同步和異步添加只影響是不死阻塞當(dāng)前線程,和任務(wù)的串行和并行執(zhí)行沒有關(guān)系适室。
##Dispatch Group
1. group里的任務(wù) 串行執(zhí)行
2. group里的任務(wù)并行執(zhí)行(注意: 1 是在主線程中 而2 是在系統(tǒng)的global線程中)
3. 用wait()監(jiān)聽group中任務(wù)執(zhí)行完畢? 在并發(fā)執(zhí)行中不可靠
When usingdispatch_group_asyncto call methods that are, themselves, asynchronous, the group will finish as soon as all of the asynchronous tasks have started, but will not wait for them to finish. Instead, you can manually calldispatch_group_enterbefore you make the asynchronous call, and then calldispatch_group_leavewhen the asynchronous call finish. Thendispatch_group_waitwill now behave as expected.
4. 用enter,leave举瑰, notice 方法 監(jiān)聽group中任務(wù)執(zhí)行完畢