轉:iOS開發者常常用到的多線程都有啥?

轉:http://www.elsyy.com/news/2014/1124/6812140770.html
iOS開發中的多線程,無疑是個很重要的知識點,要想把握多線程這塊,就要學會如下這些。

1、進程
在移動端,一個app就是一個進程,在內存中佔用必定的空間。
在計算機裏,一個程序就是一個進程,一樣也佔用內存空間。
iOS同一時間點只有一個進程在使用CPU,只是系統把這個時間片分割地很是短,形成一種多個進程同時在執行的假象。

2、線程
一個進程的執行,必然從一個主線程開始。整個應用能夠由單個主線程運行,可是涉及到一些耗時的任務,例如打開淘寶app,必然要加載一大堆的圖片。
這時,若是隻有單線程執行,程序必須等着圖片都加載完畢才能繼續往下執行,期間用戶的交互就不起做用,這樣用戶體驗很很差。
因此,這時就衍生出多線程的概念,能夠開子線程給那些耗時的任務,在旁邊默默地執行,而不影響應用的大局。
主線程,通常用來處理主體的展現(例如控制器的切換)和交互事件。
子線程,通常用來處理耗時的任務。固然,並非線程越多越好,多線程的使用也是要慎重考慮。

3、同步和異步
我以前一直對同步和異步這個概念理解不清,經常混淆。同步是線程安全呢,仍是異步線程安全呢?
今天終於記清楚了這個概念,只要記住一句話——同步,就是同類;異步,就是異類。已是同類,那確定是處於同一個線程;異類,那就說明不是一個線程。

4、並行和串行
並行:併發執行
串行:按順序執行,一個接一個

5、三種經常使用建立多線程方式
1.NSThread:程序員手動管理線程,而多線程的狀況下,線程何時執行完畢是未知的,若是管理很差,會形成內存泄露,因此這種方法不提倡。
2.NSOperation\NSOperationQueue。這兩個類必須是搭配使用的,將操做放入操做隊列中,依次執行。
使用步驟:建立NSOperation;添加NSOperation到NSOperationQueue
優勢:更加面向對象;能夠控制最大併發數 maxConcurrentOperationCount,使用這個屬性能夠保證同一時間內最大的併發數;添加任務(Operation)之間的依賴 addDependency,使用這個屬性能夠控制一個Operation必須在其依賴的Operation執行完畢後才調用。html

3.GCD(官方推薦使用,純C語言)
調用同步(異步)執行的方法,傳入要並行(串行)執行的隊列參數,執行方法內的block代碼。說白了就是同一時間有一個仍是多個線程執行,就看調用的方法和傳入的隊列類型。
隊列類型:
全局隊列:全部添加到全局隊列中的任務都是併發執行(同時執行,可能會開啓多個線程)
串行隊列:全部添加到串行隊列中的任務都是按順序執行(開一條線程)
主隊列:全部添加到主隊列中的任務都是在主線程中執行的(跟方法名沒有關係)
同步仍是異步,取決於方法名(不影響主隊列,影響全局隊列、串行隊列)
同步:dispatch_sync,在當前線程執行任務,不會開啓新的線程
異步:dispatch_async,在其餘線程執行任務,會開啓新的線程
代碼demo演示:從組合學上說,老是共有四種狀況:串行-同步、串行-異步、並行-同步、並行-異步。
串行-同步:顯然一直只有一個線程在執行(這個就是真正意義上單線程)
串行-異步:可能會產生多個線程,可是同一時間只有一個線程在執行(異步雖然會產生多個不一樣線程,可是同一時間只有一個線程在執行)
並行-同步:同一時間點有多個相同的線程在執行
並行-異步:同一時間有多個不一樣的線程在執行(這是真正意義上的多線程)

下面就只舉兩個例子,剩下的2種狀況觸類旁通就是了程序員

而主隊列的使用,經常用來執行完子線程後,要講數據返回主線程來進行處理。好比開啓子線程下載某個資源,下載完畢須要回調到主線程來展現。能夠在子線程完成的時候調用如下的方法返回主線程,同時可以將子線程獲得的參數傳給處理的selector方法裏執行。安全

四、開啓後臺線程多線程


更多關於移動互聯網開發的知識,你們不妨到良師益友網來學習視頻教程。併發

相關文章
相關標籤/搜索