iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现
?
?
1.iOS的三種多線程技術
1.NSThread 每個NSThread對象對應一個線程,量級較輕(真正的多線程) 2.以下兩點是蘋果專門開發(fā)的“并發(fā)”技術,使得程序員可以不再去關心線程的具體使用問題 ?NSOperation/NSOperationQueue 面向對象的線程技術 ?GCD —— Grand Central Dispatch(派發(fā)) 是基于C語言的框架,可以充分利用多核,是蘋果推薦使用的多線程技術?
以上這三種編程方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單,也是Apple最推薦使用的,在項目中很多框架技術分別使用了不同多線程技術。
?
2.三種多線程技術的對比
?NSThread: –優(yōu)點:NSThread 比其他兩個輕量級,使用簡單 –缺點:需要自己管理線程的生命周期、線程同步、加鎖、睡眠以及喚醒等。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷 ?NSOperation: –不需要關心線程管理,數(shù)據(jù)同步的事情,可以把精力放在自己需要執(zhí)行的操作上 –NSOperation是面向對象的 ?GCD: –Grand Central Dispatch是由蘋果開發(fā)的一個多核編程的解決方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和強大的技術 –GCD是基于C語言的 ?
3.三種多線程技術的實現(xiàn)
3.1. NSThread的多線程技術,
?
?1> 類方法直接開啟后臺線程,并執(zhí)行選擇器方法
? ? detachNewThreadSelector
1 // 新建一個線程,調用@selector方法 2 3 [NSThread detachNewThreadSelector:@selector(bigDemo) toTarget:self withObject:nil];
?
?
?
?2> 成員方法,在實例化線程對象之后,需要使用start執(zhí)行選擇器方法
? ? initWithTarget
// 成員方法NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(bigDemo) object:nil];// 啟動start線程[thread start];
?
?
?
?
?
?對于NSThread的簡單使用,可以用NSObject的performSelectorInBackground替代
?
1 // performSelectorInBackground是將bigDemo的任務放在后臺線程中執(zhí)行 2 3 [self performSelectorInBackground:@selector(bigDemo) withObject:nil];?
?同時,在NSThread調用的方法中,同樣要使用autoreleasepool進行內存管理,否則容易出現(xiàn)內存泄露。
1 // 自動釋放池 2 3 // 負責其他線程上的內存管理,在使用NSThread或者NSObject的線程方法時,一定要使用自動釋放池 4 5 // 否則容易出現(xiàn)內存泄露。 6 7 @autoreleasepool { 8 9 10 11 }?
?
3.2 NSOperation,面向對象的多線程技術
?
?1> 使用步驟:
? ? 1) 實例化操作
?
1 // 實例化操作隊列 2 _queue = [[NSOperationQueue alloc] init];?
?
? ? ? ? a) NSInvocationOperation
1 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opAction) object:nil]; 2 3 // 如果使用start,會在當前線程啟動操作 4 // [op1 start]; 5 6 // 1. 一旦將操作添加到操作隊列,操作就會啟動 7 [_queue addOperation:op1];?
? ? ? ? b) NSBlockOperation
1 #pragma mark 模仿下載網(wǎng)絡圖像 2 - (IBAction)operationDemo3:(id)sender 3 { 4 // 1. 下載 5 NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ 6 NSLog(@"下載 %@" , [NSThread currentThread]); 7 }]; 8 // 2. 濾鏡 9 NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ 10 NSLog(@"濾鏡 %@" , [NSThread currentThread]); 11 }]; 12 // 3. 顯示 13 NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{ 14 NSLog(@"更新UI %@" , [NSThread currentThread]); 15 }]; 16 17 // 添加操作之間的依賴關系,所謂“依賴”關系,就是等待前一個任務完成后,后一個任務才能啟動 18 // 依賴關系可以跨線程隊列實現(xiàn) 19 // 提示:在指定依賴關系時,注意不要循環(huán)依賴,否則不工作。 20 [op2 addDependency:op1]; 21 [op3 addDependency:op2]; 22 // [op1 addDependency:op3]; 23 24 [_queue addOperation:op1]; 25 [_queue addOperation:op2]; 26 [[NSOperationQueue mainQueue] addOperation:op3]; 27 }?
?
? ? 2) 將操作添加到隊列NSOperationQueue即可啟動多線程執(zhí)行
?
1 [_queue addOperation:op1]; 2 [_queue addOperation:op2];?
?2> 更新UI使用主線程隊列
?
//兩方式 [NSOpeationQueue mainQueue] addOperation ^{};[[NSOperationQueue mainQueue] addOperation:op3];?
?
?3> 操作隊列的setMaxConcurrentOperationCount
? ? 可以設置同時并發(fā)的線程數(shù)量!
1 // 控制同時最大并發(fā)的線程數(shù)量 2 [_queue setMaxConcurrentOperationCount:2];?
? ? 提示:此功能僅有NSOperation有!
?
?4> 使用addDependency可以設置任務的執(zhí)行先后順序,同時可以跨操作隊列指定依賴關系
?
1 // 添加操作之間的依賴關系,所謂“依賴”關系,就是等待前一個任務完成后,后一個任務才能啟動 2 3 // 依賴關系可以跨線程隊列實現(xiàn) 4 5 // 提示:在指定依賴關系時,注意不要循環(huán)依賴,否則不工作。 6 [op2 addDependency:op1]; 7 [op3 addDependency:op2]; 8 [op1 addDependency:op3];?
? ? 提示:在指定依賴關系時,注意不要循環(huán)依賴,否則不工作。
?
?
3.3. GCD,C語言
?
?GCD就是為了在“多核”上使用多線程技術
?
?1> 要使用GCD,所有的方法都是dispatch開頭的
?2> 名詞解釋
?global? 全局
?queue ? 隊列
?async ? 異步
?sync? ? 同步
?
?3> 要執(zhí)行異步的任務,就在全局隊列中執(zhí)行即可
?dispatch_async 異步執(zhí)行控制不住先后順序
?
?4> 關于GCD的隊列
全局隊列? ? dispatch_get_global_queue
? ? ? ? ? ? 參數(shù):優(yōu)先級 DISPATCH_QUEUE_PRIORITY_DEFAULT
?? ? ? ? ? ? ? ? 始終是 0
1 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);? ? ? ? ? ? 可同步 可異步
? ? ?
? ? ? ? 串行隊列? ?
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);?
? ? ? ? ? ? 是創(chuàng)建得到的,不能直接獲取
? ? ? ? ? ??只能同步
?
?
? ? ? ? 主隊列? ? ? dispatch_get_main_queue
1 dispatch_async(dispatch_get_main_queue(), ^{ 2 NSLog(@"main - > %@", [NSThread currentThread]); 3 });? ? ? ? ? ? 只能同歩
?
?
?5> 異步和同步與方法名無關,與運行所在的隊列有關!
?同步主要用來控制方法的被調用的順序
?
?
作者:?清澈Saup
出處:?http://www.cnblogs.com/qingche/
本文版權歸作者和博客園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
?
?
?
轉載于:https://www.cnblogs.com/qingche/p/3496190.html
總結
以上是生活随笔為你收集整理的iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 芯片里的SOP SSOP TSOP TS
- 下一篇: Mycloud Home offline