多線程技術
一、異步下載數據,是多線程技術的一個比較常見的應用場景
二、多線程技術使用場景: app中有耗時的操做或功能(一、客戶端與服務端交互;二、從數據庫中一次性讀取大量數據 三、對大量數據的解析過程),須要在主線程以外,單獨開闢一個新的線程(子線程/工做線程)來執行
iOS所支持的多線程編程方法:
NSThread
NSOperation & NSOperationQueue
GCDios
2、任務隊列
NSOperation
NSThread 操做線程最基本的類, 獲得的子線程的效率要低於NSOperation
NSOperation 是一個輕量級的線程
NSOperationQueue 線程池,操做隊列
以任務爲導向的管理線程機制,將操做(任務)放入到線程池裏,會自動執行,弱化線程的概念。(任務:能夠認爲是線程)
自定義任務
NSOperation 抽象類,若是想建立本身的任務,就要繼承NSOperation,來實現本身的類
重寫main函數!
3、GCD(推薦使用)
GCD 全稱Grand Central Dispatch(隊列調度)
是一套低層API,提供了⼀種新的方法來進⾏併發程序編寫。
從基本功能上講,GCD有點像NSOperationQueue,他們都容許程序將任務切分爲多個單一任務,而後提交⾄至⼯工做隊列來併發地或者串⾏行地執⾏行。
GCD是C實現,⽐NSOpertionQueue更底層更高效,而且它不是Cocoa框架的一部分
併發任務會像NSOperationQueue那樣基於系統負載來合適地併發進⾏,串⾏行隊列同一時間只執行單一任務
GCD的API很大程度上基於block
1.主線程隊列
主線程隊列 內部執行任務是串行的同步操做
主線程隊列不須要咱們建立,經過dispatch_get_main_queue()方法得到
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
[self taskThread1];
});
或者
dispatch_async(dispatch_get_main_queue(), ^{
[self taskThread2];
});
2.建立私有隊列 用戶隊列/串行隊列
// C接口,建立一個私有隊列 ,隊列名是一個C字符串,沒有特別的要求,Apple建議用倒裝的標識符來表示(這個名字,更多用於調試)
私有隊列內部也是串行操做
dispatch_queue_t queue = dispatch_queue_create("com.qianfeng", NULL);
dispatch_async(queue, ^{
[self taskThread2];
});
// 咱們本身建立的隊列,咱們須要本身銷燬
//dispatch_release(queue);
非arc 須要銷燬
3.全局隊列
// 並行隊列(全局)不須要咱們建立,經過dispatch_get_global_queue()方法得到
// 三個可用隊列
// 第一個參數是選取按個全局隊列,通常採用DEFAULT,默認優先級隊列
// 第二個參數是保留標誌,目前的版本沒有任何用處(不表明之後版本),直接設置爲0就能夠了
// DISPATCH_QUEUE_PRIORITY_HIGH
// DISPATCH_QUEUE_PRIORITY_DEFAULT
// DISPATCH_QUEUE_PRIORITY_LOW
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
經常使用: 在全局隊列裏增長佔用時間很長的block(數據下載,文件操做,數據庫操做),在主隊列裏刷新UI(刷新UI,務必要在主線程進行)
NSRunLoop 事件的迴路,是ios程序中實現異步事件處理的核心,每一個線程都由一個迴路來控制
currentRunLoop 拿到控制當前線程的迴路, 經過迴路來維持當前線程的活躍狀態,暫停當前線程,直到數據下載完成
while (!_isDone) {
//線程會阻塞
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
NSLog(@"任務中");
//當下載完成以後 另一個下載線程通知當前線程,這時當前線程 來了輸入源,NSRunloop 就會退出
} ;//只有下載完成 這種狀況 纔會NSRunloop真正退出 不然其餘狀況使NSRunloop 退出以後 _isDone不是yes 那麼 NSRunloop 又會繼續 run數據庫