本文主要總結前面講到的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(了解基本流程)