天天看點

iOS開發之多線程總結

本文主要總結前面講到的iOS開發中多線程實作的三個方案。

NSThread:

1.    NSThread适合輕量級多線程開發

2.    控制線程順序比較難,同時線程總數無法控制(每次建立并不能重用之前的線程,隻能建立一個新的線程)。

3.    需要程式員手動管理線程的生命周期,線程同步(線程同步對資料加鎖會有一定的系統開銷)。

1> 開線程的幾種方式

* 先建立,後啟動

NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run) object:nil];

[thread start];           

* 直接啟動

[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
或者
[self performSelectorInBackground:@selector(run) withObject:nil];           

2> 其他用法

NSThread *current = [NSThreadcurrentThread];

+ (NSThread *)mainThread; // 獲得主線程           

3> 線程間通信

[self performSelectorOnMainThread:@selector(testRun) withObject:self waitUntilDone:NO];// 等等           

GCD:(Grand CentralDispatch)

1.    GCD是蘋果公司為多核的并行運算提出的解決方案

2.    GCD會自動利用更多的CPU核心(比如雙核、四核)

3.    GCD會自動管理線程的生命周期(建立線程、排程任務、銷毀線程)

4.    程式員隻需要告訴GCD想要執行什麼任務,不需要編寫任何線程管理代碼

1> 隊列的類型

* 并發隊列

獲得全局的并發隊列:dispatch_get_global_queue

* 串行隊列

a.自己建立

dispatch_queue_create

b.主隊列

dispatch_get_main_queue

2> 執行任務的方法類型

* 同步(sync)執行

* 異步(async)執行

3> 了解隊列和方法的配合使用

4> 線程間通信

dispatch_async(

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

   //執行耗時的異步操作...

  dispatch_async(dispatch_get_main_queue(), ^{

      // 回到主線程,執行UI重新整理操作

  });

});           

5> 其他用法

dispatch_once

dispatch_after

dispatch_group_async\dispatch_group_notify

NSOperation:

1.    基于GCD的多線程實作方案,擁有GCD的優點

2.    比GCD多了一些使用的功能(自定義NSOperation)

1> 基本使用

NSInvocationOperation

NSBlockOperation

2> NSOperationQueue(重點)

* 最大并發數設定

-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;

* 設定依賴

[operationB addDependency:operationA]; // 操作B依賴于操作A

3> 自定義Operation(了解基本流程)

繼續閱讀