NSOperation的使用注意點

iOS開發(fā)中我們可以通過使用NSOperation/NSOperationQueue來實現(xiàn)多線程加叁,是基于GCD的一套封裝揉燃。NSOperation是一個抽象類唇敞。使用的方式有三個:

  1. 使用子類 NSInvocationOperation
  2. 使用子類 NSBlockOperation
  3. 自定義繼承自 NSOperation 的子類,通過實現(xiàn)內(nèi)部相應(yīng)的方法來封裝操作启昧。

具體的使用推薦查看iOS 多線程:『NSOperation叙凡、NSOperationQueue』詳盡總結(jié)
我們在自定義一個operation時可以參考SDWebImage庫里面的SDWebImageDownloaderOperation。接下來列舉幾個使用注意點:

An operation object is a single-shot object—that is, it executes its task once and cannot be used to execute it again. You typically execute operations by adding them to an operation queue (an instance of the NSOperationQueue class)`
操作對象是單快照對象密末,即它只執(zhí)行一次任務(wù)握爷,不能用于再次執(zhí)行跛璧。通常通過將操作添加到操作隊列(NSOperationQueue類的實例)來執(zhí)行操作。

If you do not want to use an operation queue, you can execute an operation yourself by calling its start method directly from your code. Executing operations manually does put more of a burden on your code, because starting an operation that is not in the ready state triggers an exception.
如果不想使用操作隊列新啼,可以直接從代碼中調(diào)用操作的start方法來執(zhí)行操作追城。手動執(zhí)行操作會給代碼帶來更大的負擔(dān),因為啟動未處于就緒狀態(tài)的操作會觸發(fā)異常燥撞。

以上是官方的說明座柱,經(jīng)過測試代碼總結(jié)如下:

  1. 將一個已完成或者正在執(zhí)行的NSOperation添加到NSOperationQueue中會拋出異常。
  2. 將一個已經(jīng)添加到queue中的NSOperation再次添加到queue中時會拋出異常物舒。
  3. 直接對NSOperation調(diào)用start方法時色洞,如果當(dāng)前NSOperation未處于就緒狀態(tài)(ready=NO)會拋出異常,通常是否就緒跟添加的NSOperation依賴有關(guān)系冠胯。
  4. 對設(shè)置了依賴關(guān)系的NSOperation之間火诸,設(shè)置優(yōu)先級不會起作用

NSOperation/NSOperationQueue
NSOperation

@property (readonly, getter=isCancelled) BOOL cancelled;
@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
- (void)addDependency:(NSOperation *)op;
- (void)removeDependency:(NSOperation *)op;
@property NSOperationQueuePriority queuePriority;

NSOperationQueue主要有兩種queue:mainQueue和自己創(chuàng)建的queue

- (void)addOperation:(NSOperation *)op;
- (void)cancelAllOperations;
@property NSInteger maxConcurrentOperationCount;
@property (getter=isSuspended) BOOL suspended;

相對于GCD,NSOperation/NSOperationQueue的比較好用的功能:

  1. 可以使用KVO監(jiān)聽NSOperation的執(zhí)行狀態(tài)荠察。
  2. 可以設(shè)置NSOperation的優(yōu)先級置蜀,添加依賴。
  3. 可以擴展NSOperation的子類悉盆,重寫main或者start方法來完成對應(yīng)任務(wù)的封裝盯荤。
  4. 可以設(shè)置NSOperationQueue最大并發(fā)數(shù)maxConcurrentOperationCount來控制串行還是并發(fā),可以使隊列中的任務(wù)暫停suspended添加到線程中舀瓢。

在自定義NSOperation子類時需要注意的是:
1. start和main方法的區(qū)別

系統(tǒng)的NSOperation中的start方法中默認實現(xiàn)是會調(diào)用main方法廷雅,main方法結(jié)束耗美,就意味著NSOperation執(zhí)行完畢京髓。
我們?nèi)绻远x的NSOperation,通過重寫start方法商架,里面創(chuàng)建具體的任務(wù)堰怨,并且不要調(diào)用super去執(zhí)行main,因為main函數(shù)執(zhí)行完操作就結(jié)束了蛇摸。
而start方法就算執(zhí)行完畢备图,它的finish屬性也不會變,因此你可以控制這個operation的生命周期赶袄,在具體的異步任務(wù)完成之后手動cancel掉這個operation揽涮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饿肺,隨后出現(xiàn)的幾起案子蒋困,更是在濱河造成了極大的恐慌,老刑警劉巖敬辣,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雪标,死亡現(xiàn)場離奇詭異零院,居然都是意外死亡,警方通過查閱死者的電腦和手機村刨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門告抄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嵌牺,你說我怎么就攤上這事打洼。” “怎么了逆粹?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵拟蜻,是天一觀的道長。 經(jīng)常有香客問我枯饿,道長酝锅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任奢方,我火速辦了婚禮搔扁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蟋字。我一直安慰自己稿蹲,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布鹊奖。 她就那樣靜靜地躺著苛聘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忠聚。 梳的紋絲不亂的頭發(fā)上设哗,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音两蟀,去河邊找鬼网梢。 笑死,一個胖子當(dāng)著我的面吹牛赂毯,可吹牛的內(nèi)容都是我干的战虏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼党涕,長吁一口氣:“原來是場噩夢啊……” “哼烦感!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起膛堤,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤手趣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骑祟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體回懦,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡气笙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怯晕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潜圃。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖舟茶,靈堂內(nèi)的尸體忽然破棺而出谭期,到底是詐尸還是另有隱情,我是刑警寧澤吧凉,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布隧出,位于F島的核電站,受9級特大地震影響阀捅,放射性物質(zhì)發(fā)生泄漏胀瞪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一饲鄙、第九天 我趴在偏房一處隱蔽的房頂上張望凄诞。 院中可真熱鬧,春花似錦忍级、人聲如沸帆谍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汛蝙。三九已至,卻和暖如春朴肺,著一層夾襖步出監(jiān)牢的瞬間窖剑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工宇挫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苛吱,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓器瘪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绘雁。 傳聞我的和親對象是個殘疾皇子橡疼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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