cocoa提供了三種不同的nsoperation:
1. nsblockoperation
block operations提供了利用block 物件來執行task的方法。
2. nsinvocationoperation
顧名思義,invocation operation提供了呼叫普通method來執行task的方法。
繼承自nsoperation,自定義nsoperation。在自定義nsoperation時,至少要重寫main和/或start函式。也必須重寫
i***ecuting
和isfinished
,並通過kvo通知其他物件。你還必須為自定義的operation指定乙個初始化函式。
先來乙個block operation同步執行的**:
nsblockoperation *******operation = [nsblockoperation blockoperationwithblock:^
}];[******operation start];
nslog(@"main thread is here");
return yes;}
通過nslog輸出的順序可以看出,******operation堵塞了mainthread,main thread會等待block執行完成之後再執行。
operation預設是在建立它的執行緒中通過start方法來執行,我們可以將******operation加入nsoperationqueue中來實現非同步執行,也可以自定義operation並detach乙個新的執行緒來執行:
nsoperationqueue*queue = [[nsoperationqueuealloc] init];
[queue
addoperation
:******operation];
當你把乙個operation加入到queue之後,你不用手動的去start,因為queue會幫你完成,queue會管理所有加入到其中的operation。如果你想自己控制(並不推薦這樣做),你可以採用detach thread的方法。
如果有多個operation需要新增,呼叫函式:
- (void)addoperations:(nsarray *)ops waituntilfinished:(bool)wait
同時,可以獲取queue中當前有哪些operation以及operation的數目:
- (nsarray *)operations;
- (nsuinteger)operationcount;
你也可以為queue設定優先順序:
- (nsoperationqueuepriority)queuepriority;
- (void)setqueuepriority:(nsoperationqueuepriority)p;
為queue新增乙個便於記憶的名字:
- (void)setname:(nsstring *)n ;
- (nsstring *)name ;
暫停queue:
- (void)setsuspended:(bool)b;
- (bool)issuspended;
顧名思義,這種operation就是在乙個nsobject物件中去呼叫方法(method)。同樣的,我們先來看一下同步執行的情況:
self.******operation = [[nsinvocationoperation alloc]initwithtarget:self
selector:@selector(******operationentry:) object:******object];
[self.******operation start];
這樣,******operation會在建立它的當前執行緒中(一般是main thread)執行,並且它的執行會堵塞當前執行緒。
當然,這樣做並沒有多大的實際意義,但是如果我們把******operation加入到queue中,它就可以和當前執行緒並行執行,從而提高效率。
nsnumber *firstnumber = [nsnumber numberwithinteger:111];
nsnumber *secondnumber = [nsnumber numberwithinteger:222];
self.firstoperation =[[nsinvocationoperation alloc] initwithtarget:self
selector:@selector(firstoperationentry:) object:firstnumber];//first
self.secondoperation = [[nsinvocationoperation alloc] initwithtarget:self
selector:@selector(secondoperationentry:) object:secondnumber];//second
self.operationqueue = [[nsoperationqueue alloc] init];
/* add the operations to the queue */
[self.operationqueue addoperation:self.firstoperation];
[self.operationqueue addoperation:self.secondoperation];
在上面的**裡,兩個operation都在各自的執行緒中與main thread並行執行,而且這兩個operation之間也是並行的。在queue中可以get、set最大並行operation數:
- (nsinteger)maxconcurrentoperationcount;
- (void)setmaxconcurrentoperationcount:(nsinteger)cnt;
那麼,如果我要讓secondoperation在firstoperation之後執行呢?也就是說secondoperation需要等到firstoperation執行完成之後才開始。乙個operation可以依賴於另乙個或者多個operations,即等待依賴於的operation執行完成之後再執行。如果你沒有為乙個operation新增依賴,那麼你對它何時執行將沒有控制權。
adddependency:方法可以解決這一問題,在新增到queue之前為兩個operation新增依賴屬性。
[self.secondoperation adddependency:self.firstoperation];
當不再需要依賴的時候,呼叫removedependency:取消依賴。
[self.secondoperation removedependency:self.firstoperation];
另外,nsinvocationoperation還可以以指定的初始化函式初始化:
- (id)initwithinvocation:(nsinvocation *)inv;// designated initializer
乙個operation有相應的狀態來標識它的執行過程。
- (bool)iscancelled;
- (bool)i***ecuting;
- (bool)isfinished;
- (bool)isconcurrent;
- (bool)isready;
通過- (void)cancel可以取消乙個operation。
在queue中,通過- (void)cancelalloperations來取消所有operation。
iOS併發程式設計 鎖
import import import import define iterations 1024 1024 32 void testlock now cfabsolutetimegetcurrent printf nslock f sec n now then then cfabsoluteti...
併發程式設計(二)
使得乙個物件在當前範圍之外可見。比如通過公開方法返回乙個物件的引用 通過類靜態變數公布物件.與之對應的是逸出,指不正確的發布物件,比如將乙個私有的物件發布出去,或者還沒有正確構造完成物件,此物件就已經對外部可見 共有四種方式安全地發布物件 在單例模式中,如何保證只例項化乙個物件並保證執行緒安全?下面...
JAVA併發程式設計(二)
一.可見性 讀操作能實時的看到寫操作最新寫入的值。在單執行緒中,讀操作總能得到寫操作寫入的值 但在多執行緒中,如果讀操作跟寫操作在不同的執行緒中執行,那麼讀操作將不一定能適時的看到其他執行緒寫入的值。二.重排序 在沒有使用同步的情況下,編譯器 處理器 執行時都有可能做操作的執行順序進行一些調整。三....