你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iphone多線程編程GCD

iphone多線程編程GCD

編輯:IOS開發綜合

iphone開發過程中,如果遇到加載大數據或者涉及到網絡通信情況時,就需要在後台線程來完成這些事情。

除了NSThread之外,iphone還提供了一套GCD機制幫助開發者來實現多線程開發。

同NSThread相比,GCD的運行效率更高,開發更簡單。

GCD的基礎是dispatch queue和block。

 

1. block可以簡單理解為一個任務。block在程序中的表現形式類似: 

1 NSString * URL = @"......";

2

3 ^{

4

5     UIImage * image = [UIImage imageWithURL:URL];

6

7 };

從上例可以看出,block可以引用外部作用域的數據。這也是很block和普通函數的區別,block會保存當前執行的上下文。

 

2. dispatch queue是一個FIFO任務隊列,可以將一些block壓入這個隊列中,系統會按照順序來執行這些block。

dispatch_async()

系統中默認提供了三種dispatch queue:

a. Main. 如果某個block希望在主線程完成,可以將其push到main dispatch queue中。

b. Concurrent. 系統會自動創建三個不同優先級的dispatch queue。不能保證block嚴格按照順序執行。

c. Serial. 需要用戶手動創建,能夠保證block嚴格按照push的順序執行。

 

下面是一段異步加載網絡圖像的例子:

 1 UIImageView * imageView = [[UIImageView alloc] init];

 2

 3   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

 4

 5     UIImage * image = ;//網絡拉取代碼

 6

 7     dispatch_async(dispatch_get_main_queue (), ^{

 8

 9       imageView.image = image; // 在主線程中更新imageview

10

11     });

12

13   });

從以上代碼可以看出,GCD的前後台線程同步通知機制要比NSThread優雅和方便很多。

 

apple官方文檔請參考:

http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

其他資料:

  /kf/201111/112639.html

 

作者 dongliqian

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved