1、可以用GCD來代替加鎖方式。
例如屬性的讀取和寫入操作,
_syncQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
-(NSString *)someString{
__block NSString *localSomeString;
? dispatch_sync(
localSomeString = _someString;
)
return ?localSomeString;
}
-(void)setSomeString:(NSString *)someString{
dispatch_barrier_async( _syncQueue,^{
_someString = someString;
})
}
讀取操作用普通塊來實(shí)現(xiàn),然后寫入操作用柵欄塊來實(shí)現(xiàn),讀取操作可以并行,但寫入操作必須單獨(dú)執(zhí)行;其中設(shè)置函數(shù)可以用同步的柵欄塊來實(shí)現(xiàn),因?yàn)楫惒降男枰猚opy ? block塊,會降低效率。
2、多用GCD,少用performSelector系列方法
performSelector系列方法在內(nèi)存管理方面容易有疏忽,因?yàn)榫幾g器無法判斷方法是否有返回值,和返回值的類型,所以ARC編譯器也就無法插入適當(dāng)?shù)膬?nèi)存管理方法。
performSelector系列方法所能處理的方法太過局限,方法的返回值類型和發(fā)送的參數(shù)個(gè)數(shù)都有限制
如果把任務(wù)放到線程中,最好不要用performSelector,而使用GCD來實(shí)現(xiàn)。
3、掌握GCD及操作隊(duì)列的使用時(shí)機(jī)
使用NSOperation以及NSOperationQueue好處:取消某個(gè)操作很容易、容易指定操作間的依賴關(guān)系、通過鍵值觀測機(jī)制監(jiān)控NSOperation對象的屬性、容易指定操作的優(yōu)先級、可以重用NSOperation對象。
所以用操作隊(duì)列(NSOperation)有時(shí)候比派發(fā)隊(duì)列(GCD)更方便。
4、通過Dispatch Group機(jī)制,根據(jù)系統(tǒng)資源狀況來執(zhí)行任務(wù)
dispatch group是GCD的一項(xiàng)特性,能夠吧任務(wù)分組。
dispatch_group_enter(<#dispatch_group_t? _Nonnull group#>)
dispatch_group_leave(<#dispatch_group_t? _Nonnull group#>)
上面兩個(gè)方法可以指定任務(wù)所屬的組,第一個(gè)可以使分組的任務(wù)增加,下面一個(gè)可以使分組的任務(wù)減少,兩者要配合使用
除了吧任務(wù)提交到并發(fā)隊(duì)列外,也可以把任務(wù)提交到各個(gè)串行隊(duì)列上,并用group來監(jiān)控執(zhí)行狀況
有時(shí)候不需要用dispatch_group,使用dispatch_apply也會持續(xù)阻塞,直到所有任務(wù)都執(zhí)行完畢,所以,如果把塊派給了當(dāng)前隊(duì)列(或者體系中高于當(dāng)前隊(duì)列的某個(gè)串行隊(duì)列),將導(dǎo)致死鎖,若想在后臺執(zhí)行任務(wù),則應(yīng)使用dispatch_group最好。
5、不要使用dispatch_get_current_queue