iOS:多线程的详细介绍
二、3種多線程技術對比
1.NSThread 2.NSOperation 3.GCD —— Grand?Central?Dispatch,是基于C語言的框架以上這三種編程方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單,也是Apple最推薦使用的。但是就目前而言,iOS的開發者,需要了解三種多線程技術的基本使用過程。因為很多框架技術分別使用了不同多線程技術。例如NSURLConnection的異步靜態方法:sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
?NSThread: 優點:NSThread?比其他兩個輕量級,使用簡單 缺點:需要自己管理線程的生命周期、線程同步。線程同步對數據的加鎖會有一定的系統開銷 ?NSOperation: 不需要關心線程管理,數據同步的事情,可以把精力放在自己需要執行的操作上 ?GCD: Grand Central?Dispatch是由蘋果開發的一個多核編程的解決方案。iOS4.0+才能使用,是替代NSThread,?NSOperation的高效和強大的技術,用途廣泛,蘋果公司極力推崇的一個框架。 ? ? ?三、創建線程的主要3種方式
? ? ???創建線程方法: 1.+?(void)detachNewThreadSelector:(SEL)selector?toTarget:(id)target?withObject:(id)argument; 2.- (id)initWithTarget:(id)target?selector:(SEL)selector?object:(id)argument; 3.繼承NSThread類,然后在子類中重寫父類的執行線程的main方法。 ? ?參數說明: selector:線程執行的方法,只能有一個參數,不能有返回值 target:selector消息發送的對象 argument:傳輸給target的唯一參數,也可以是nil ?NSObject直接加入了多線程的支持,允許對象的某個方法在后臺運行(本方法普遍應用在游戲中,利用多線程播放聲音) ?- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg; ?四、NSThread的使用
?當涉及到共享資源爭奪時,共享資源的數據加鎖是一個難點,既要保證數據安全,又要保證線程執行效率 –使用前加鎖 –盡快使用 –使用完解鎖 –再去做其他的事情 ?多線程編寫順序 1.單個方法調試OK 2.單個線程調試OK 3.增加線程,并考慮線程加鎖、解鎖的準確位置。 ?注意: –只有主線程能夠修改UI –如果不涉及到內存爭搶,NSThread寫多線程是最簡單的 ? ?當不涉及共享資源爭奪時,使用NSObject的performSelectorInBackground方法可以非常的方便地實現多線程 ?五、?NSOperation?&?NSOperationQueue的使用? ? ?
?NSOperation的兩個子類 1.NSInvocationOperation 2.NSBlockOperation 3.子類化NSOperation,然后重寫main方法 ?工作原理: 1.用NSOperation封裝要執行的操作 2.將創建好的NSOperation對象放NSOperationQueue中 3.啟動OperationQueue開始新的線程執行隊列中的操作 ?注意事項: 1.使用多線程時通常需要控制線程的并發數,因為線程會消耗系統資源,同時運行的線程過多,系統會變慢 2.使用以下方法可以控制并發的線程數量:- (void)setMaxConcurrentOperationCount:(NSInteger)cnt
?使用小結:
?NSOperation中無需使用線程鎖
?除更新UI之外,對共享資源的爭奪也需放在主線程隊列之中
?將定義的操作添加至隊列之后,多線程便開始啟動
?NSBlockOperation的使用相比NSInvocationOperation更加靈活、方便
?通過setMaxConcurrentOperationCount方法可以控制并發的最大線程數量
六、GCD的使用
?GCD是基于C語言的框架 ?工作原理: –讓程序平行排隊的特定任務,根據可用的處理資源,安排它們在任何可用的處理器上執行任務 –要執行的任務可以是一個函數或者一個block –底層是通過線程實現的,不過程序員可以不必關注實現的細節 –GCD中的FIFO隊列稱為dispatch queue,可以保證先進來的任務先得到執行 –dispatch__notify可以實現監聽一組任務是否完成,完成后得到通知 ?dispatch?queue: 1.Main dispatch queue:是全局可用的隊列,用于在主線程上執行任務 2.Serial:同時只執行一個任務 3.Concurrent:可以并發地執行多個任務,但是執行完成的順序是隨機的 ? ?使用小結: ?GCD的原理和Operation非常相像,只是它是C語言架構的。 ?GCD中無需使用線程鎖 ?除更新UI之外,對共享資源的爭奪也需放在主調度隊列之中 ?將任務添加至群組,并指定全局操作隊列,使得GCD的多線程更加靈活、方便 ?dispatch_group_notify可以監聽一組任務是否完成。這個方法很有用,比如你執行三個下載任務,當三個任務都下載完成后,才通知界面說已經完成 ?如果不需要監聽一組任務,可以直接使用dispatch_async方法最后建議:
?關于多線程必須記住的三個要點 –只能在主線程中更新UI –共享數據爭奪的處理 –不要使用多種多線程技術去爭奪同一個資源! ?在使用多線程的時候,是為了處理并發操作的。如果有可能,我們不要去做搶資源的事情!?
? 程序猿神奇的手,每時每刻,這雙手都在改變著世界的交互方式! 分類:?iOS高級本文轉自當天真遇到現實博客園博客,原文鏈接:http://www.cnblogs.com/XYQ-208910/p/4856923.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的iOS:多线程的详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01背包模板、全然背包 and 多重背包
- 下一篇: logback输出日志到sentry