最近看了一下日本人寫的Objective-C高級編程,將自己對GCD的理解梳理一下;
相關(guān)名詞理解
我最近一直在總結(jié)隊列與線程到底什么關(guān)系?
隊列就是一些任務聚合在一起,然后一個隊列可以用多個線程來執(zhí)行,當然一個隊列中的一個任務只能用一個線程來執(zhí)行。然后程序員將告訴系統(tǒng):隊列中的任務怎么添加,怎么執(zhí)行,系統(tǒng)的線程就會按照程序員的意思去執(zhí)行。
1串行隊列:簡單的理解就是串在一起的任務,加入到串行隊列中的任務會依次執(zhí)行;Serial Dispatch Queue。
2并行隊列:并行隊列相對于串行隊列,加入到并行隊列中的任務會同時執(zhí)行。Concurrent Dispatch Queue。
既然有了隊列的概念,就會想到,怎么將任務添加到隊列中?這里的任務,就是block;
1同步添加:將block同步添加到隊列中。同步添加完任務以后,會等待當前任務的執(zhí)行完畢,所以使用這個同步添加的時候要記得有個等待的過程。同步添加用的是dispatch_sync,對于等待的理解,這個函數(shù)就相當于Dispatch_group_wait(下面會對這個函數(shù)解釋);并且在判斷會不會導致死鎖時,就是根據(jù)自己不能等待自己來判斷會不會死鎖;dispatch_sync。
2異步添加:異步添加相對于同步添加就是不需要等待,添加到隊列中后,可以一邊執(zhí)行,一邊添加任務;dispatch_async。
主要API的用途及其解釋
1當需要在子線程進行一些操作,然后回到主線程操作時:
dipatch_async(queue,block);
前面的參數(shù)是隊列,后面是任務;
2需要等待某些任務執(zhí)行完后再執(zhí)行某些操作時:
dispatch_after(time,queue,block);
需要注意的是這里的的時間是在指定的時間內(nèi)添加到隊列中,而不是在指定時間后執(zhí)行,因為這些函數(shù)都是一些添加到隊列中的函數(shù)。還有就是可以指定過完多少時間和指定一個具體的時間。過完多少時間用dispacth_time_t,具體時間用dispatch_walltime(這個怎么用,還有點小復雜);
3在多個隊列執(zhí)行完畢后,再執(zhí)行某個隊列時:這種情況還是發(fā)生比較多,比如說,下載完三張圖片以后再執(zhí)行某些操作;
先要創(chuàng)建一個dispatch_group_t,然后用dispatch_group_async(group,queue,block);來將任務添加到隊列中,最后用dipatch_group_notify(group,queue,block)來添加執(zhí)行完前面的操作之后最后需要執(zhí)行的操作;

4保證多線程安全的只執(zhí)行一次的創(chuàng)建單例的函數(shù)
dispatch_once(dispatch_once_t *predicate,block);
次要API的用途及其解釋
1解決一邊讀文件,一邊寫文件的操作。就是當讀完一部分文件以后,需要等待讀取前面部分的完畢,再寫于一部分數(shù)據(jù)后再執(zhí)行讀取操作,就是一個并行讀完-串行寫入-并行繼續(xù)讀;
dispactch_barrier_async(queue,block);
這個函數(shù)會等待添加到同一個隊列中前面的任務執(zhí)行完以后,在執(zhí)行這個barrier中的任務,然后再執(zhí)行后面的任務。是一種隊列中,中間有個任務,必須等待前面的任務執(zhí)行完,再執(zhí)行完中間這個任務后,再執(zhí)行后面的任務;
2需要將制定的任務(block)添加到指定的隊列中執(zhí)行指定的次數(shù)
dispatch_apply(number,queue,^(size_t index){
}?);
注意:這里的block中帶有參數(shù),這是未了區(qū)分各個block而使用的。
3掛起當前的隊列,恢復當前的隊列
掛起用dispatch_suspend? 恢復用dispatch_resume;
還有一些api我暫時覺得還用不到,所以先沒有列出來