日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现

發布時間:2024/1/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

?

1.iOS的三種多線程技術  

1.NSThread 每個NSThread對象對應一個線程,量級較輕(真正的多線程) 2.以下兩點是蘋果專門開發的“并發”技術,使得程序員可以不再去關心線程的具體使用問題 ?NSOperation/NSOperationQueue 面向對象的線程技術 ?GCD —— Grand Central Dispatch(派發) 是基于C語言的框架,可以充分利用多核,是蘋果推薦使用的多線程技術

?

以上這三種編程方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單,也是Apple最推薦使用的,在項目中很多框架技術分別使用了不同多線程技術。

?

2.三種多線程技術的對比  

?NSThread: –優點:NSThread 比其他兩個輕量級,使用簡單 –缺點:需要自己管理線程的生命周期、線程同步、加鎖、睡眠以及喚醒等。線程同步對數據的加鎖會有一定的系統開銷 ?NSOperation: –不需要關心線程管理,數據同步的事情,可以把精力放在自己需要執行的操作上 –NSOperation是面向對象的 ?GCD: –Grand Central Dispatch是由蘋果開發的一個多核編程的解決方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和強大的技術 –GCD是基于C語言的

?

3.三種多線程技術的實現 

3.1. NSThread的多線程技術, 

?

?1> 類方法直接開啟后臺線程,并執行選擇器方法

? ? detachNewThreadSelector

  

1 // 新建一個線程,調用@selector方法 2 3 [NSThread detachNewThreadSelector:@selector(bigDemo) toTarget:self withObject:nil];

?

?

?

?2> 成員方法,在實例化線程對象之后,需要使用start執行選擇器方法

? ? initWithTarget

 

// 成員方法NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(bigDemo) object:nil];// 啟動start線程[thread start];

?

?

?

?

?

?對于NSThread的簡單使用,可以用NSObject的performSelectorInBackground替代

?

1 // performSelectorInBackground是將bigDemo的任務放在后臺線程中執行 2 3 [self performSelectorInBackground:@selector(bigDemo) withObject:nil];

?

?同時,在NSThread調用的方法中,同樣要使用autoreleasepool進行內存管理,否則容易出現內存泄露。

1   // 自動釋放池 2 3 // 負責其他線程上的內存管理,在使用NSThread或者NSObject的線程方法時,一定要使用自動釋放池 4 5 // 否則容易出現內存泄露。 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 模仿下載網絡圖像 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 // 依賴關系可以跨線程隊列實現 19 // 提示:在指定依賴關系時,注意不要循環依賴,否則不工作。 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即可啟動多線程執行

?

1 [_queue addOperation:op1]; 2 [_queue addOperation:op2];

?

?2> 更新UI使用主線程隊列

?

//兩方式 [NSOpeationQueue mainQueue] addOperation ^{};[[NSOperationQueue mainQueue] addOperation:op3];

?

?

?3> 操作隊列的setMaxConcurrentOperationCount

? ? 可以設置同時并發的線程數量!

1 // 控制同時最大并發的線程數量 2 [_queue setMaxConcurrentOperationCount:2];

?

? ? 提示:此功能僅有NSOperation有!

?

?4> 使用addDependency可以設置任務的執行先后順序,同時可以跨操作隊列指定依賴關系

?  

1 // 添加操作之間的依賴關系,所謂“依賴”關系,就是等待前一個任務完成后,后一個任務才能啟動 2 3 // 依賴關系可以跨線程隊列實現 4 5 // 提示:在指定依賴關系時,注意不要循環依賴,否則不工作。 6 [op2 addDependency:op1]; 7 [op3 addDependency:op2]; 8 [op1 addDependency:op3];

?

? ? 提示:在指定依賴關系時,注意不要循環依賴,否則不工作。

?

?

3.3. GCD,C語言       

?

?GCD就是為了在“多核”上使用多線程技術

?

?1> 要使用GCD,所有的方法都是dispatch開頭的

?2> 名詞解釋

?global? 全局

?queue ? 隊列

?async ? 異步

?sync? ? 同步

?

?3> 要執行異步的任務,就在全局隊列中執行即可

?dispatch_async 異步執行控制不住先后順序

?

?4> 關于GCD的隊列

全局隊列? ? dispatch_get_global_queue

? ? ? ? ? ? 參數:優先級 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);

?

? ? ? ? ? ? 是創建得到的,不能直接獲取

? ? ? ? ? ??只能同步

?

?

? ? ? ? 主隊列? ? ? 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 三种多线程技术的对比及实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。