iOS并發(fā)編程

iOS編程中,有多種并發(fā)編程的方式膛腐,比較常見的就是基于Operation Queue和GCD睛约,還有底層一點的NSTheard,本文主要討論Operation Queue和GCD


異步調(diào)用和并發(fā)

在談并發(fā)之前哲身,談一談異步調(diào)用和并發(fā)辩涝,異步調(diào)用是指調(diào)用時無需等待結(jié)果返回的調(diào)用。并發(fā)是指多個任務(wù)(線程)同時執(zhí)行勘天,在異步調(diào)用的實現(xiàn)中往往用的都是并發(fā)機制怔揩,但也有可能是其他機制,比如一些依靠中斷進行的操作脯丝。(中斷:(Interrupt)是指處理器接收到來自硬件或軟件的信號商膊,提示發(fā)生了某個事件,應(yīng)該被注意宠进,這種情況就稱為中斷晕拆。)

Operation Queue

operation queue提供了一個面向?qū)ο蟮牟l(fā)編程接口,并支持并發(fā)數(shù)(僅operation queue支持)材蹬,線程優(yōu)先級实幕,任務(wù)優(yōu)先級,任務(wù)依賴關(guān)系等多種配置

1.面向?qū)ο蠼涌?br>

2.支持并發(fā)數(shù)配置

3.任務(wù)優(yōu)先級調(diào)度

4.任務(wù)依賴關(guān)系

5.線程優(yōu)先級配置

NSOperation簡介

在operation queue中堤器,把每個并發(fā)任務(wù)都定義為一個operation昆庇,對應(yīng)的類名是NSOperation,NSOperation是一個抽象類吼旧,無法直接使用凰锡,它只定義了Operation的一些基本方法,我們需要創(chuàng)建一個基于他的子類或者使用系統(tǒng)預(yù)定于的子類圈暗,目前系統(tǒng)預(yù)定義了兩個子類:NSInvocationOperation和NSBlockOperation掂为。

NSInvocationOperation

NSInvocationOperation是一個基于對象和selector的Operation,使用這個你只需要指定對象以及任務(wù)的selector员串,如果有必要勇哗,還可以設(shè)定傳遞的參數(shù)。

NSInvocationOperation *invacationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomethingWithObj:) object:obj];

當(dāng)這個Operation完成后寸齐,你可以通過下面的方法獲得調(diào)用執(zhí)行后返回的結(jié)果對象欲诺。

id result = [invacationOperation result];

NSBlockOperation

如果不是在一個函數(shù)中執(zhí)行任務(wù)抄谐,而是在一個block中執(zhí)行一個任務(wù)的話,這是我們就需要NSBlockOperation

NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{

//Do?something?here.

}];

運行一個Operation

[Operation start] 扰法;

start方法用來啟動一個Operation任務(wù)蛹含。同時,Operation提供一個main方法塞颁,你的所有任務(wù)都應(yīng)該在main中進行處理浦箱。默認(rèn)的start方法中會先做出一些異常判斷然后直接調(diào)用main方法。如果需要自定義一個NSOperation必須重載main方法來執(zhí)行你所想要執(zhí)行的任務(wù)祠锣。

取消一個Operation

要取消一個Operation酷窥,要發(fā)送cancel消息:

[operation cancel];

當(dāng)像一個Operation對象發(fā)送cancel消息之后,并不能保證這個Operation就一定能理科取消伴网,這取決于你的main中對cancel的處理蓬推,,如果你在main中沒有對cancel進行任何處理的話澡腾,發(fā)送cancel消息是沒有任何效果的沸伏,為了讓Operation響應(yīng)cancel消息,那么你就要在main方法中一些適當(dāng)?shù)牡胤绞謩优袛鄆sCancelled屬性蛋铆,如果返回為YES的話馋评,應(yīng)該釋放相關(guān)資源并立刻停止繼續(xù)執(zhí)行。

創(chuàng)建可并發(fā)的Operation

由于默認(rèn)下Operation的start方法中直接調(diào)用了main方法刺啦,而main方法中會有比較耗時的處理任務(wù)留特,如果我們在一段代碼中連續(xù)start了多個Operation的話,這個Operation都是阻塞地依次執(zhí)行完玛瘸,因為第二個Operation必須等到第一個Operation執(zhí)行完start內(nèi)的main并返回蜕青,Operation默認(rèn)都是不可并發(fā)的(使用了Operation Queue除外,Operation Queue會獨自管理自己的線程)糊渊,因為默認(rèn)Operation并不額外創(chuàng)建賢臣右核,我們可以通過OPeration的isConcurrent方法來判斷Operation是否是可并發(fā)的,如果要讓OPeration可并發(fā)渺绒,我們需要讓main在單獨的線程執(zhí)行贺喝,并將isConcurrent返回YES。

這個方法是在每一個Operation中自己用NSThread來創(chuàng)建線程宗兼,當(dāng)然躏鱼,這樣的行為并不是如我們所愿的

@implementation MyOperation{

BOOL????????executing;

BOOL????????finished;

}

-?(BOOL)isConcurrent?{

returnYES;

}

-?(void)start?{

if([self?isCancelled])

{

[self?willChangeValueForKey:@"isFinished"];

finished?=?YES;

[self?didChangeValueForKey:@"isFinished"];

return;

}

[self?willChangeValueForKey:@"isExecuting"];

[NSThread?detachNewThreadSelector:@selector(main)?toTarget:self?withObject:nil];

executing?=?YES;

[self?didChangeValueForKey:@"isExecuting"];

}

-?(void)main?{

@try{

//?Do?some?work.

[self?willChangeValueForKey:@"isFinished"];

[self?willChangeValueForKey:@"isExecuting"];

executing?=?NO;

finished?=?YES;

[self?didChangeValueForKey:@"isExecuting"];

[self?didChangeValueForKey:@"isFinished"];

}

@catch(...)?{

//?Exception?handle.

}

}

@end

當(dāng)你自定義了start或main方法時,一定要手動的調(diào)用一些KVO通知方法殷绍,以便讓對象的KVO機制可以正常運作染苛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市主到,隨后出現(xiàn)的幾起案子茶行,更是在濱河造成了極大的恐慌躯概,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畔师,死亡現(xiàn)場離奇詭異娶靡,居然都是意外死亡,警方通過查閱死者的電腦和手機茉唉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門固蛾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人度陆,你說我怎么就攤上這事∠揍#” “怎么了懂傀?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜡感。 經(jīng)常有香客問我蹬蚁,道長,這世上最難降的妖魔是什么郑兴? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任犀斋,我火速辦了婚禮,結(jié)果婚禮上情连,老公的妹妹穿的比我還像新娘叽粹。我一直安慰自己,他們只是感情好却舀,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布虫几。 她就那樣靜靜地躺著,像睡著了一般挽拔。 火紅的嫁衣襯著肌膚如雪辆脸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天螃诅,我揣著相機與錄音啡氢,去河邊找鬼。 笑死术裸,一個胖子當(dāng)著我的面吹牛倘是,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播穗椅,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼辨绊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匹表?” 一聲冷哼從身側(cè)響起门坷,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宣鄙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后默蚌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冻晤,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年绸吸,在試婚紗的時候發(fā)現(xiàn)自己被綠了鼻弧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡锦茁,死狀恐怖攘轩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情码俩,我是刑警寧澤度帮,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站稿存,受9級特大地震影響笨篷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓣履,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一率翅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袖迎,春花似錦冕臭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脯宿,卻和暖如春念颈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背连霉。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工榴芳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跺撼。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓窟感,卻偏偏與公主長得像,于是被迫代替她去往敵國和親歉井。 傳聞我的和親對象是個殘疾皇子柿祈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容