iOS 3種多線程對比

1. iOS三種多線程技術(shù)

  • NSThread每個NSThread對象對應(yīng)一個線程,量級較輕(真正的多線程)
  • NSOperation/NSOperationQueue 面向?qū)ο蟮木€程技術(shù)
  • GCD —— Grand Central Dispatch(派發(fā)) 是基于C語言的框架染坯,可以充分利用多核均芽,是蘋果推薦使用的多線程技術(shù)
    • (后兩點是蘋果專門開發(fā)的“并發(fā)”技術(shù),使得程序員可以不再去關(guān)心線程的具體使用問題)

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

2. 三種多線程技術(shù)的對比

  • NSThread:
    –優(yōu)點:NSThread 比其他兩個輕量級,使用簡單
    –缺點:需要自己管理線程的生命周期昼窗、線程同步是趴、加鎖、睡眠以及喚醒等澄惊。線程同步對數(shù)據(jù)的加鎖會有一定的系統(tǒng)開銷
  • NSOperation:
    –不需要關(guān)心線程管理唆途,數(shù)據(jù)同步的事情,可以把精力放在自己需要執(zhí)行的操作上
    –NSOperation是面向?qū)ο蟮?/li>
  • GCD:
    –Grand Central Dispatch是由蘋果開發(fā)的一個多核編程的解決方案掸驱。iOS4.0+才能使用肛搬,是替代NSThread, NSOperation的高效和強(qiáng)大的技術(shù)
    –GCD是基于C語言的

3. 三種多線程的技術(shù)實現(xiàn)

  • NSThread的技術(shù)實現(xiàn):

1> 類方法直接開啟后臺線程毕贼,并執(zhí)行選擇器方
detachNewThreadSelector

// 新建一個線程温赔,調(diào)用@selector方法
[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替代

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

同時啤贩,在NSThread調(diào)用的方法中,同樣要使用autoreleasepool進(jìn)行內(nèi)存管理拜秧,否則容易出現(xiàn)內(nèi)存泄露痹屹。

     // 自動釋放池
  
     // 負(fù)責(zé)其他線程上的內(nèi)存管理,在使用NSThread或者NSObject的線程方法時枉氮,一定要使用自動釋放池
 
     // 否則容易出現(xiàn)內(nèi)存泄露志衍。
  
      @autoreleasepool {
  
  
 
   }
  • NSOperation,面向?qū)ο蟮亩嗑€程技術(shù)實現(xiàn):

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,會在當(dāng)前線程啟動操作
4 //    [op1 start];
5     
6     // 1. 一旦將操作添加到操作隊列聊替,操作就會啟動
7     [_queue addOperation:op1];

b) NSBlockOperation (新)

1 #pragma mark 模仿下載網(wǎng)絡(luò)圖像
 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     // 添加操作之間的依賴關(guān)系楼肪,所謂“依賴”關(guān)系,就是等待前一個任務(wù)完成后惹悄,后一個任務(wù)才能啟動
18     // 依賴關(guān)系可以跨線程隊列實現(xiàn)
19     // 提示:在指定依賴關(guān)系時春叫,注意不要循環(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 可以設(shè)置同時并發(fā)的線程數(shù)量
1     // 控制同時最大并發(fā)的線程數(shù)量
2     [_queue setMaxConcurrentOperationCount:2];

提示:此功能僅有NSOperation有象缀!

4 ) 使用addDependency可以設(shè)置任務(wù)的執(zhí)行先后順序,同時可以跨操作隊列指定依賴關(guān)系
1      // 添加操作之間的依賴關(guān)系爷速,所謂“依賴”關(guān)系央星,就是等待前一個任務(wù)完成后,后一個任務(wù)才能啟動
2 
3    // 依賴關(guān)系可以跨線程隊列實現(xiàn)
4 
5     // 提示:在指定依賴關(guān)系時惫东,注意不要循環(huán)依賴莉给,否則不工作。
6   [op2 addDependency:op1];
7   [op3 addDependency:op2];
8   [op1 addDependency:op3];

提示:在指定依賴關(guān)系時廉沮,注意不要循環(huán)依賴颓遏,否則不工作。

- GCD 技術(shù)實現(xiàn)滞时, C語言

GCD就是為了在“多核”上使用多線程技術(shù)

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

2> 名詞解釋

global 全局

queue 隊列

async 異步

sync 同步

3> 要執(zhí)行異步的任務(wù),就在全局隊列中執(zhí)行即可

dispatch_async 異步執(zhí)行控制不住先后順序

4> 關(guān)于GCD的隊列

  • 全局隊列(并發(fā)隊列):dispatch_get_global_queue
    Concurrent queue(global dispatch queue):

參數(shù):優(yōu)先級 DISPATCH_QUEUE_PRIORITY_DEFAULT
始終是 0

1  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

(可同步 可異步)

  • 串行隊列:Serial quque(private dispatch queue)
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> 異步和同步與方法名無關(guān)曼玩,與運(yùn)行所在的隊列有關(guān)!

同步主要用來控制方法的被調(diào)用的順序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窒百,一起剝皮案震驚了整個濱河市黍判,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篙梢,老刑警劉巖顷帖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡贬墩,警方通過查閱死者的電腦和手機(jī)榴嗅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來震糖,“玉大人录肯,你說我怎么就攤上這事趴腋〉跛担” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵优炬,是天一觀的道長颁井。 經(jīng)常有香客問我,道長蠢护,這世上最難降的妖魔是什么雅宾? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮葵硕,結(jié)果婚禮上眉抬,老公的妹妹穿的比我還像新娘。我一直安慰自己懈凹,他們只是感情好蜀变,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著介评,像睡著了一般库北。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上们陆,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天寒瓦,我揣著相機(jī)與錄音,去河邊找鬼坪仇。 笑死杂腰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的椅文。 我是一名探鬼主播喂很,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雾袱!你這毒婦竟也來了恤筛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤芹橡,失蹤者是張志新(化名)和其女友劉穎毒坛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡煎殷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年屯伞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豪直。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡劣摇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弓乙,到底是詐尸還是另有隱情末融,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布暇韧,位于F島的核電站勾习,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏懈玻。R本人自食惡果不足惜巧婶,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涂乌。 院中可真熱鬧艺栈,春花似錦、人聲如沸湾盒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽历涝。三九已至诅需,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荧库,已是汗流浹背堰塌。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留分衫,地道東北人场刑。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像蚪战,于是被迫代替她去往敵國和親牵现。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 797評論 0 3
  • 一邀桑、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關(guān)多線程的基本概念瞎疼。本篇博文介紹的是iOS中常用的幾個多...
    nuclear閱讀 2,050評論 6 18
  • 歡迎大家指出文章中需要改正或者需要補(bǔ)充的地方,我會及時更新壁畸,非常感謝贼急。 一. 多線程基礎(chǔ) 1. 進(jìn)程 進(jìn)程是指在系...
    xx_cc閱讀 7,185評論 11 70
  • 我看書很慢茅茂,《紅樓夢》看了整個初中,非要把里面的詩文全部抄下來才算滿足√ィ現(xiàn)在依然如此空闲,凡是書中遇到的概念、人物走敌、事...
    王小刀刀閱讀 279評論 2 2
  • 不要回頭 你就一直走吧 我確實沒有想過我的初戀居然是不到一周 我真的不知道怎么了 是真的不夠喜歡他 還是浪夠了 自...
    小名王蕊蕊閱讀 224評論 0 0