多線程的使用

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS中,只有主線程跟Cocoa關(guān)聯(lián),也即是在這個(gè)線程中,更新UI總是有效的,如果在其他線程中更新UI有時(shí)候會成功...
    mengyingguo閱讀 616評論 0 0
  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 953評論 0 3
  • 學(xué)習(xí)多線程,轉(zhuǎn)載兩篇大神的帖子,留著以后回顧!第一篇:關(guān)于iOS多線程,你看我就夠了 第二篇:GCD使用經(jīng)驗(yàn)與技巧...
    John_LS閱讀 740評論 0 3
  • 文章目錄GCD簡介任務(wù)和隊(duì)列GCD的使用步驟隊(duì)列的創(chuàng)建方法任務(wù)的創(chuàng)建方法GCD的基本使用并行隊(duì)列 + 同步執(zhí)行并行...
    lusen_b閱讀 298評論 0 1
  • 1.串行隊(duì)列 1.1串行隊(duì)列創(chuàng)建 dispatch_queue_t queue = dispatch_queue_...
    Coder_XiaoD閱讀 326評論 0 0

友情鏈接更多精彩內(nèi)容