多線程的概念:編程
瞭解多線程以前須要先知道兩個名詞:多線程
進程:計算機當中運行的每個獨立的程序能夠稱之爲計算機的一個進程。併發
線程:將同一個任務分發出去處理,負責分發處理的就是一個個線程async
例如:函數
當用戶點擊一個按鈕進行加載數據時,這時用戶不可能一直等着加載完再去進行別的操做,若是時單一進程的話,沒有加載完以前,程序時不容許進行其餘操做的。這顯然時不合適的。url
所以爲了應對這種需求,就出現了多線程的概念。實現多線程的方法有不少,在這裏咱們只瞭解蘋果公司咱們封裝好的多線程處理方案(GCD);spa
GCD(Grand Central Dispatch): 是蘋果公司開發的一個多核編程的解決方法。線程
dispatch queue 分爲三種:code
1, 運行在主線程Main queue,經過dispatch_get_main_queue獲取
2, 並行隊列global dispatch queue,經過dispatch_get_global_queue獲取,由系統建立三個不一樣優先級的dispatch queue。並行隊列的執行順序與其加入隊列的順序相同。
3, 串行隊列serial queues通常用於按順序同步訪問,可建立任意數量的串行隊列,各個串行隊列之間是併發的。 當想要任務按照某一個特定的順序執行時,串行隊列是頗有用的。串行隊列在同一個時間只執行一個任務。咱們可使用串行隊列代替鎖去保護共享的數據。和鎖不一樣,一個串行隊列能夠保證任務在一個可預知的順序下執行。 serial queues經過dispatch_queue_create建立,可使用函數dispatch_retain和dispatch_release去增長或者減小引用計數。
GCD的用法:隊列
[cpp]
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSURL * url = [NSURL URLWithString:@"http://www.baidu.com"]; NSError * error; NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; if (data != nil) { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"call back, the data is: %@", data); }); } else { NSLog(@"error when download:%@", error); } }); 複製代碼