NSOperation和NSOPerationQueue

一. 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)一定不要添加循環依賴


一. NSOperatioinQueue

1.主隊列

  • 放在主隊列中的操作,都在主線程執行
    <pre><code>NSOPerationQueue mainQueue</code></pre>

2.非主隊列

  • 放在非主隊列中的操作,都在子線程執行
    <pre><code>[[NSOPerationQueue alloc] init]</code></pre>

3.一般定義成全局屬性


4.每一個操作都有一個start方法,用來在當前線程執行

  • 本質:將操作添加到操作隊列之后,內部會自動調用內部start方法,操作就會自動執行

  • 主隊列和非主隊列決定操作在哪條線程執行(在哪條線程啟動操作的start方法)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容