一. NSOperatioin
1.目的
- 開啟線程
- 提供一些GCD不具備的功能
- OC框架,內部封裝的是GCD
2.區別
- GCD執行效率高于NSOperation
- NSOperation提供了一些GCD中不具備的功能(暫停/恢復/取消)---管理操作-NSOperation的高級用法
3.NSOperation本身是一個抽象類不可以直接使用,實際開發中使用其子類
- 蘋果提供了兩個原生子類
- NSInvocationOperation
<pre><code>NSInvocationOperation *op = [[NSInvocationOperation alloc]<br />initWithTarget:self selector:@selector(test) object:nil];</code></pre> - NSBlockOperation
-
將操作封裝在block中
<pre>NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{NSLog(@"操作1---------%@",[NSThread currentThread]);
}];</pre> -
可以追加操作(無限)---如果在非主隊列執行操作,原操作和追加的操作都會開啟多條線程去執行
<pre>
[op1 addExecutionBlock:^{NSLog(@"追加操作2-----------%@",[NSThread currentThread]);
}];</pre> 缺點:
1) 有過在主隊列執行操作,有一個操作在主線程執行(隨機),其他操作在子線程執行
2) 如果直接調用 start 方法執行操作,無法確定每一個操作在哪條線程執行
3) 一般不要追加操作,除非就是在非主隊列執行操作依賴 (串行/線程同步技術)添加數量不要太多
1)對于不同的操作隊列中的操作依然有效
2)添加操作依賴要在添加操作隊列之前
3)只能對添加在操作隊列的操作添加依賴
4)一定不要添加循環依賴
-
- NSInvocationOperation
一. NSOperatioinQueue
1.主隊列
- 放在主隊列中的操作,都在主線程執行
<pre><code>NSOPerationQueue mainQueue</code></pre>
2.非主隊列
- 放在非主隊列中的操作,都在子線程執行
<pre><code>[[NSOPerationQueue alloc] init]</code></pre>
3.一般定義成全局屬性
4.每一個操作都有一個start方法,用來在當前線程執行
本質:將操作添加到操作隊列之后,內部會自動調用內部start方法,操作就會自動執行
主隊列和非主隊列決定操作在哪條線程執行(在哪條線程啟動操作的start方法)