1.預設情況下,nsoperation並不具備封裝操作的能力,必須使用它的子類,使用nsoperation子類的方式有3種:
1> nsinvocationoperation
2> nsblockoperation
3> 自定義子類繼承nsoperation,實現內部相應的方法
這講先介紹如何用nsoperation封裝乙個操作,後面再結合nsoperationqueue來使用。
## 一、nsinvocationoperation
nsinvocationoperation *operation = [[[nsinvocationoperation alloc] initwithtarget:self selector:@selector(run:) object:@"mj"] autorelease]; 2 [operation start];
* 第1行初始化了乙個nsinvocationoperation物件,它是基於乙個物件和selector來建立操作
* 第2行呼叫了start方法,緊接著會馬上執行封裝好的操作,也就是會呼叫self的run:方法,並且將@"mj"作為方法引數
* 這裡要注意:預設情況下,呼叫了start方法後並不會開一條新執行緒去執行操作,而是在當前執行緒同步執行操作。只有將operation放到乙個nsoperationqueue中,才會非同步執行操作。
## 二、nsblockoperation
### 1.同步執行乙個操作
nsblockoperation *operation = [nsblockoperation blockoperationwithblock:^()];
4 // 開始執行任務
5 [operation start];
* 第1行初始化了乙個nsblockoperation物件,它是用乙個block來封裝需要執行的操作
* 第2行呼叫了start方法,緊接著會馬上執行block中的內容
* 這裡還是在當前執行緒同步執行操作,並沒有非同步執行
### 2.併發執行多個操作
nsblockoperation *operation = [nsblockoperation blockoperationwithblock:^()];
5 [operation addexecutionblock:^() ];
9 [operation addexecutionblock:^() ];
13 [operation addexecutionblock:^() ];
17 // 開始執行任務
18 [operation start];
* 第1行初始化了乙個nsblockoperation物件
* 分別在第5、9、13行通過addexecutionblock:方法新增了新的操作,包括第1行的操作,一共封裝了4個操作
* 在第18行呼叫start方法後,就會併發地執行這4個操作,也就是會在不同執行緒中執行
1 2013-02-02 21:38:46.102 thread[4602:c07]## 三、nsoperation的其他用法又執行了1個新的操作,執行緒: 2 2013-02-02 21:38:46.102 thread[4602:3f03]
又執行了1個新的操作,執行緒: 3 2013-02-02 21:38:46.102 thread[4602:1b03]
執行第1次操作,執行緒:
4 2013-02-02 21:38:46.102 thread[4602:1303] 又執行了1個新的操作,執行緒:
### 1.取消操作
operation開始執行之後, 缺省會一直執行操作直到完成,我們也可以呼叫cancel方法中途取消操作
### 2.在操作完成後做一些事情
如果想在乙個nsoperation執行完畢後做一些事情,就呼叫nsoperation的setcompletionblock方法來設定想做的事情
operation.completionblock = ^()
13 return self;
14 }
15 // 釋放記憶體
16 - (void)dealloc
21 // 執行主任務
22 - (void)main
27 }
28 @end
* 如果這個downloadoperation是在非同步執行緒中執行操作,也就是說main方法在非同步執行緒呼叫,那麼將無法訪問主線程的自動釋放池,所以在第24行建立了乙個屬於當前執行緒的自動釋放池
### 2.正確響應取消事件
* 預設情況下,乙個nsoperation開始執行之後,會一直執行任務到結束,就比如上面的downloadoperation,缺省會執行完main方法中的所有**。
* nsoperation提供了乙個cancel方法,可以取消當前的操作。
* 如果是自定義nsoperation的話,需要手動處理這個取消事件。比如,一旦呼叫了cancel方法,應該馬上終止main方法的執行,並及時**一些資源。
* 處理取消事件的具體做法是:在main方法中定期地呼叫iscancelled方法檢測操作是否已經被取消,也就是說是否呼叫了cancel方法,如果返回yes,表示已取消,則立即讓main方法返回。
* 以下地方可能需要呼叫iscancelled方法:
* 在執行任何實際的工作之前,也就是在main方法的開頭。因為取消可能發生在任何時候,甚至在operation執行之前。
* 執行了一段耗時的操作之後也需要檢測操作是否已經被取消
1 - (void)main
15
16 // 初始化
17 uiimage *image = [uiimage imagewithdata:imagedata];
18
19 if (self.iscancelled)
23
24 if ([self.delegate respondstoselector:@selector(downloadfinishwithimage:)])
28 }
29 }
* 在第4行main方法的開頭就先判斷operation有沒有被取消。如果被取消了,那就沒有必要往下執行了
* 總之,執行了一段比較耗時的操作之後,都需要判斷操作有沒有被取消
NSOperation 簡單使用
nsoperation 是一種多執行緒技術 起基本原理是把相應地操作放在佇列裡邊 然後有佇列分發處理。佇列的建立 初始化乙個佇列 return 初始化好的對列 nsoperationqueue myqueue return myqueue 向佇列中新增操作 pragma mark 同時併發執行緒數量...
NSOperation的繼承實現
1.執行緒同步 原子操作,條件鎖,遞迴鎖,synchronized nscondition 同步執行的順序。2.執行緒間通訊 在主線程做事 performselectoronmainthread 在子執行緒做事 performselectorinbackground 在指定執行緒做事 perform...
NSOperation的基本使用
viewcontroller.m nsoperation的基本使用 nsoperation的作用 配合使用nsopertaion和nsoperationqueue也能實現多執行緒程式設計 nsopertaion和nsoperationqueue實現多執行緒的具體步驟 先將需要執行的操作封裝到乙個ns...