多線程GCD

1:GCD?

創建隊列:

串行隊列:

dispatch_queue_t? queue=dispatch_queue_creat(@"lac.jianshu.weibo",DISPATCH_QUEUE_SERIAL);

GCD提供兩種Dispatch Queue, 分別為Concurrent Dispatch Queue 和 Serial Dispatch Queue.

Serial Dispatch Queue 使用一個thread,默認為nil。

Concurrent Dispatch Queue 使用多個thread。

如果是對數據庫表更新或更新文件,最好為每一個表或文件建立一個Serial Dispatch Queue,這樣能保證只有一個thread會對數據進行更新。

如果對那些不會引起數據不一致問題的任務,需要放到Concurrent Dispatch Queue執行。

dispatch_sync(queue, ^{});


全局隊列:

dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_get_gloabal_queue 的第一個參數為枚舉類型(默認為0),決定任務的優先級 ,第二個參數為Apple保留參數,傳0

#define DISPATCH_QUEUE_PRIORITY_HIGH? ? ? ? 2

#define DISPATCH_QUEUE_PRIORITY_DEFAULT? ? 0

#define DISPATCH_QUEUE_PRIORITY_LOW? ? ? ? (-2)

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND? INT16_MIN(后臺任務,優先級最低)

主隊列 :dispatch_queue_t main_queue=dispatch_get_main_queue();


延時3秒加載:dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW,3*NSEC_PER_SEC);

dispatch_after(time, dispatch_get_main_queue(),^{

NSLog(@"after 3 seconds...");});

dispatch_set_target_queue: 主要用來給新建的queue設置優先級

dispatch_set_target_queue(queue1,系統queue2);

第一個參數是自定義的queue1,而不是系統的queue。因為你不能給系統的queue設置權限。通過上面設置,queue1 就有了與系統queue2一樣的優先級。其實這個函數不僅可以設置queue的優先級,還可以設置queue之間的層級結構。

dispatch_group_notify 可以在group中的dispatch queue都執行完之后,通過一個dispatch_group_notify通知回調

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{NSLog(@"task1");});

dispatch_group_async(group, queue, ^{NSLog(@"task2");});

dispatch_group_async(group, queue, ^{NSLog(@"task3");});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"finished...");});

dispatch_barrier_async

dispatch_barrier_async是一個可以讓當前任務等待queue其他任務完成再執行的函數。例如,從數據庫讀取數據是可以多線程并發讀取的,因為這樣提高效率。但是,更新數據庫數據,就要保證只有一個線程進行更新操作。所以,當更新操作發生的時候,一定要保證讀操作和其他更新操作等待。

dispatch_onece 保證了dispatch_once中的代碼只會被執行一次,常用于單例。

dispatch semaphore 是一個信號量的counter,當counter為0,當前線程停止運行,當大于0,自減1,繼續執行。

dispatch_semaphore_wait? dispatch_semaphore_signal

dispatch_semaphore_signal?

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);所以在下面的代碼中,就可以保證在wait和signal中的[array addObject:[NSNumber numberWithInt:i]]; 就只有一個thread進行操作,保證了線程安全

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

NSMutableArray *array = [[NSMutableArray alloc] init];

for (int i = 0; i < 100000; i++)

{

dispatch_async(queue, ^{

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

[array addObject:[NSNumber numberWithInt:i]];

dispatch_semaphore_signal(semaphore);

});

}

dispatch_apply

dispatch_apply用于給一個block添加到dispatch queue若干次。 “for”循環

dispatch_suspend/dispatch_resume

用于暫停和繼續執行queue

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • iOS多線程編程 寫在前面,歡迎互相交流,歡迎指出錯誤; 基本概念 進程:計算機中的程序關于某數據集合上的一次運行...
    wtqhy14615閱讀 226評論 0 0
  • 最近頗花了一番功夫把多線程GCD人的一些用法總結出來,一來幫自己鞏固一下知識、二來希望能幫到對這一塊還迷茫...
    人活一世閱讀 296評論 1 1
  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 853評論 0 3
  • 進程與線程 進程就是一個應用程序在處理機上的一次執行過程,它是一個動態的概念,而線程是進程中的一部分,進程包含多個...
    朱敏_ITer閱讀 346評論 0 1
  • #幸福是需要修出來的~每天進步1%~幸福實修08班~015-董超-杭州 20170713(25/99) 【幸福三朵...
    julie123閱讀 126評論 1 3