首先講一下關於線程的基礎知識。網絡
進程是指在系統中正在運行的一個應用程序 每一個進程之間是獨立的,每一個進程均運行在其專用且受保護的內存空間內。多線程
1個進程要想執行任務,必須得有線程(每1個進程至少要有1條線程)線程是進程的基本執行單元,一個進程(程序)的全部任務都在線程中執行。併發
同一時間,CPU只能處理1條線程,只有1條線程在工做(執行)多線程併發(同時)執行,實際上是CPU快速地在多條線程之間調度(切換)若是CPU調度線程的時間足夠快,就形成了多線程併發執行的假象思考:若是線程很是很是多,會發生什麼狀況?CPU會在N多線程之間調度,CPU會累死,消耗大量的CPU資源每條線程被調度執行的頻次會下降(線程的執行效率下降)異步
多線程的優勢 能適當提升程序的執行效率 能適當提升資源利用率(CPU、內存利用率) 多線程的缺點 開啓線程須要佔用必定的內存空間(默認狀況下,主線程佔用1M,子線程佔用512KB),若是開啓大量的線程,會佔用大量的內存空間,下降程序的性能 線程越多,CPU在調度線程上的開銷就越大 程序設計更加複雜:好比線程之間的通訊、多線程的數據共享函數
線程中有4個最主要的名詞。性能
1.串行隊列。spa
// 隊列名稱, 隊列屬性,通常用NULL便可 dispatch_queue_t dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);線程
主隊列是GCD自帶的一種特殊的串行隊列,放在主隊列中的任務,都會放到主線程中執行 使用dispatch_get_main_queue()得到主隊列設計
2.併發隊列。 GCD默認已經提供了全局的併發隊列,供整個應用使用,不須要手動建立code
使用dispatch_get_global_queue函數得到全局的併發隊列 // 此參數暫時無用,用0便可。
dispatch_queue_t dispatch_get_global_queue(dispatch_queue_priority_t priority,unsigned long flags);
GCD 小結:
其實多線程就是在多個線程之間快速作「切換」的操做(在線程調度池裏執行任務)。 線程裏有個屬性是優先級。這個屬性決定的是線程有更多的機會去調用。並非決定任務的前後順序。 並且注意!!!!開發中 必定不要取修改優先級。不然會出現不少你想不到的錯誤。 不能把同步任務加入到主隊列中。不然會出現同步鎖現象。
-(NSInteger)maxConcurrentOperationCount;- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
說明:若是沒有設置最大併發數,那麼併發的個數是由系統內存和CPU決定的,可能內存多久開多一點,內存少就開少一點。 注意:num的值並不表明線程的個數,僅僅表明線程的ID。 提示:最大併發數不要亂寫(5之內),不要開太多,通常以2~3爲宜,由於雖然任務是在子線程進行處理的,可是cpu處理這些過多的子線程可能會影響UI,讓UI變卡。
- (void)cancelAllOperations; 提⽰:也能夠調用NSOperation的- (void)cancel⽅法取消單個操做
(2)暫停和恢復隊列
-(void)setSuspended:(BOOL)b; // YES表明暫停隊列,NO表明恢復隊列 -(BOOL)isSuspended; //當前狀態
(3)暫停和恢復的適用場合:在tableview界面,開線程下載遠程的網絡界面,對UI會有影響,使用戶體驗變差。那麼這種狀況,就能夠設置在用戶操做UI(如滾動屏幕)的時候,暫停隊列(不是取消隊列),中止滾動的時候,恢復隊列。
NSOperation 小結:
GCD和NSOperation 都各有各的好處。 GCD可以開多個線程 可是並不能管理。 可是NSOperation 能夠管理線程。還能夠設置最大操做併發數。 而GCD可使用延時方法 after 和sleep 還有一次性once方法 建立單例對象。 根據你所須要的去選擇恰當的方法。