iOS併發程式設計(二) NSOperation

2021-06-14 06:22:16 字數 3743 閱讀 8130

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併發程式設計(二)

一.可見性 讀操作能實時的看到寫操作最新寫入的值。在單執行緒中,讀操作總能得到寫操作寫入的值 但在多執行緒中,如果讀操作跟寫操作在不同的執行緒中執行,那麼讀操作將不一定能適時的看到其他執行緒寫入的值。二.重排序 在沒有使用同步的情況下,編譯器 處理器 執行時都有可能做操作的執行順序進行一些調整。三....