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