iOS多線程GCD詳解

來源:互聯網
上載者:User

標籤:

 

我們在這裡複習下GCD。

1.什麼是GCD?

GCD全稱Grand Central Dispatch,我們通俗的翻譯叫牛逼的中心調度。

2.我們用GCD幹什嗎?

通過 GCD,開發人員不用再直接跟線程打交道了,只需要向隊列中添加代碼塊即可,GCD 在後端管理著一個線程池。GCD 不僅決定著你的代碼塊將在哪個線程被執行,它還根據可用的系統資源對這些線程進行管理。這樣可以將開發人員從線程管理的工作中解放出來,通過集中的管理線程,來緩解大量線程被建立的問題。

GCD 帶來的另一個重要改變是,作為開發人員可以將工作考慮為一個隊列,而不是一堆線程,這種並行的抽象模型更容易掌握和使用。

首先,系統提供給你一個叫做 主隊列(main queue) 的特殊隊列。和其它串列隊列一樣,這個隊列中的任務一次只能執行一個。然而,它能保證所有的任務都在主線程執行,而主線程是唯一可用於更新 UI 的線程。這個隊列就是用於發生訊息給 UIView 或發送通知的。

系統同時提供給你好幾個並發隊列。它們叫做 全域調度隊列(Global Dispatch Queues) 。目前的四個全域隊列有著不同的優先順序:background、low、default 以及 high。要知道,Apple 的 API 也會使用這些隊列,所以你添加的任何任務都不會是這些隊列中唯一的任務。

最後,你也可以建立自己的串列隊列或並發隊列。這就是說,至少有五個隊列任你處置:主隊列、四個全域調度隊列,再加上任何你自己建立的隊列。

3.GCD相比其他多線程有哪些優點?
  • GCD 能通過延遲昂貴計算任務並在後台運行它們來改善你的應用的響應效能。
  • GCD 提供一個便於使用的並行存取模型而不僅僅只是鎖和線程,以協助我們避開並發陷阱。
  • GCD 具有在常見模式(例如單例)上用更高效能的原語最佳化你的代碼的潛在能力。
  • GCD 會自動利用更多的CPU核心(比如雙核、四核)
4.GCD術語
  • 串列(Serial):讓任務一個接著一個地執行(一個任務執行完畢後,再執行下一個任務)
  • 並發(Concurrent):可以讓多個任務並發(同時)執行(自動開啟多個線程同時執行任務)並發功能只有在非同步(dispatch_async)函數下才有效。
  • 同步(Synchronous):在當前線程中執行任務,不具備開啟新線程的能力
  • 非同步(Asynchronous):在新的線程中執行任務,具備開啟新線程的能力
5.使用GCD

1.認識主隊列,感受串列隊列的運行,運行結果列印的是 1,2,3,4,順序執行。

1
2
3
4
5
6
7
8
9
10
11
12
13
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
NSLog(@"1");
});
dispatch_async(mainQueue, ^{
NSLog(@"2");
});
dispatch_async(mainQueue, ^{
NSLog(@"3");
});
dispatch_async(mainQueue, ^{
NSLog(@"4");
});

2.認識全域隊列,體驗並發隊列的運行,運行結果隨機列印:2,3,1,4,隨機執行。

1
2
3
4
5
6
7
8
9
10
11
12
13
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(defaultQueue, ^{
NSLog(@"1");
});
dispatch_async(defaultQueue, ^{
NSLog(@"2");
});
dispatch_async(defaultQueue, ^{
NSLog(@"3");
});
dispatch_async(defaultQueue, ^{
NSLog(@"4");
});

3.建立自訂隊列

1
2
3
4
5
6
7
8
9
10
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.bjsxt.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(concurrentQueue, ^{
NSLog(@"4");
dispatch_sync(concurrentQueue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"5");
});
NSLog(@"6");
});

4.GCD在單例中的運用dispatch_once

1
2
3
4
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"onceToken");
});

5.消極式載入dispatch_after

1
2
3
4
5
6
double delayInSeconds = 2.0;
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW,delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, mainQueue, ^{
NSLog(@"延時執行的2秒");
});

6.調度組dispatch_group_t

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_async(group, defaultQueue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"1");
});
dispatch_group_async(group, defaultQueue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"2");
});
dispatch_group_notify(group, defaultQueue, ^{
NSLog(@"3");
});

//等價於

// dispatch_group_enter(group);
// dispatch_async(defaultQueue, ^{
//
// NSLog(@"1");
// dispatch_group_leave(group);
// });

7.dispatch_barrier_async

在前面的任務執行結束後它才執行,而且它後面的任務等它執行完成之後才會執行.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dispatch_queue_t queue = dispatch_queue_create("com.bjsxt.barrierExecute", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"1");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:4];
NSLog(@"2");
});
dispatch_barrier_async(queue, ^{
NSLog(@"3");
[NSThread sleepForTimeInterval:4];

});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"4");
});

8.執行某個代碼dispatch_apply

1
2
3
4
dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(5, defaultQueue, ^(size_t i) {
NSLog(@"%lu",i);
});

參考文章:

https://github.com/nixzhu/dev-blog

http://objccn.io/issue-2-1/

另外.....

我的願望是.......

世界和平.........

iOS多線程GCD詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.