多線程之NSOperation進階用法


前言

? ? ?面對復雜多變的需求,有時候需要用到線程的暫停、取消拿霉、監(jiān)聽等缸废,這里在 NSOperation 基礎用法 的基礎上進行進階拓展包蓝。關于本文以及NSOperation 基礎用法 的代碼Demo驶社,我放在了我的github上,可以去下載來看一下测萎,因為這個是Demo所以也覺得大家沒必要給star亡电,以后我會在github上造一些輪子,到時候如果大家覺得好用的話硅瞧,勞煩給個star份乒,如果有什么疑惑或者覺得我有哪些不對,迫切希望來技術討論腕唧。

正文

1或辖、 取消 、 暫停 和恢復

(1)取消

可以直接調用NSOperationQueue的cancelAllOperations方法枣接,也可以逐個Operation取消颂暇。

取消了一個操作時,它不會立刻停止但惶。它需要再次進入“main”函數(shù)中耳鸯,檢查到isCancelled == YES 時被取消掉;否則膀曾,操作會一直執(zhí)行到完成為止县爬。

(2)暫停 和 恢復

通過suspended 的 setter方法來設定暫停或恢復添谊。

2捌省、操作優(yōu)先級

通過 queuePriority 的setter 方法和getter方法 進行優(yōu)先級操作

系統(tǒng)提供了以下幾個優(yōu)先級:

3、操作依賴

(1)NSOperation之間可以設置依賴來保證執(zhí)行順序碉钠,?如一定要讓操作A執(zhí)行完后,才能執(zhí)行操作B,可以像下面這么寫

[operationB addDependency:operationA]; // 操作B依賴于操作

(2)可以在不同queue的NSOperation之間創(chuàng)建依賴關系

4纲缓、監(jiān)聽

(1)completionBlock

通過completionBlock 這個block可以監(jiān)聽到operation操作結束。

?@property(nullable,copy)void(^completionBlock)(void)NS_AVAILABLE(10_6,4_0);

(2)KVO

可以通過KVO 監(jiān)聽 Operation 的isExecuting, isFinished, isConcurrent 和 isReady等屬性喊废,來判斷相對應狀態(tài)祝高。

5、自定義子類

NSOperation的子類化一般都是采取重寫start污筷、main方法工闺。當重寫“start”方法時,必須處理好isExecuting, isFinished, isConcurrent 和 isReady這些屬性瓣蛀。否則會導致操作類部分功能失效陆蟆。

關于start方法與main方法的執(zhí)行時機,可以粗略這樣理解:operation加入queque時直接執(zhí)行main惋增,不調用start叠殷;調用start方法時,在start方法中調用main方法诈皿。

代碼如下林束,我放了一份Demo代碼在我的github上像棘,可以下載參考一下。

-(instancetype)initWithOperationBlock:(OperationBlock)operationBlock {

self= [superinit];

if(self) {

_isAsyn=YES;

_operationBlock= operationBlock;

}

returnself;

}

//NSOperation的子類化一般都是采取重寫start main方法壶冒,但是也可以自己實現(xiàn)其他方法,可以參考一下AFNetWorking

-(void)start {

//同步情況是才會調用start

_isAsyn=NO;

if(self.cancelled) {//被取消

_isFinished=YES;

}else{//未被取消

_isExecuting=YES;

[selfmain];

}

}

-(void)main {

@autoreleasepool{

void(^cancelBlock)() = ^() {

_isExecuting=NO;

_isFinished=YES;

};

if(!self.isCancelled) {

_operationBlock();

cancelBlock();

}

}

}

//重寫getter方法是為了在外部能完整獲取相關信息

#pragma mark重寫getter方法

-(BOOL)isFinished {

return_isFinished;

}

-(BOOL)isConcurrent{

return!_isAsyn;

}

-(BOOL)isExecuting {

return_isExecuting;

}

#pragma mark Class Method

//異步

+(void)asynOperationBlock:(OperationBlock)operationBlock {

WXSOperation*operation = [[WXSOperationalloc]init];

operation.operationBlock= [operationBlockcopy];

NSOperationQueue*queue = [[NSOperationQueuealloc]init];

[queueaddOperation:operation];

}

//同步

+(void)synOperationBlock:(OperationBlock)operationBlock {

WXSOperation*operation = [[WXSOperationalloc]initWithOperationBlock:operationBlock];

//如果添加到queue里缕题,依然是異步

[operationstart];

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胖腾,隨后出現(xiàn)的幾起案子烟零,更是在濱河造成了極大的恐慌,老刑警劉巖咸作,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓶摆,死亡現(xiàn)場離奇詭異,居然都是意外死亡性宏,警方通過查閱死者的電腦和手機群井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毫胜,“玉大人书斜,你說我怎么就攤上這事〗褪梗” “怎么了荐吉?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長口渔。 經(jīng)常有香客問我样屠,道長,這世上最難降的妖魔是什么缺脉? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任痪欲,我火速辦了婚禮,結果婚禮上攻礼,老公的妹妹穿的比我還像新娘业踢。我一直安慰自己,他們只是感情好礁扮,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布知举。 她就那樣靜靜地躺著,像睡著了一般太伊。 火紅的嫁衣襯著肌膚如雪雇锡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天僚焦,我揣著相機與錄音锰提,去河邊找鬼。 笑死,一個胖子當著我的面吹牛欲账,可吹牛的內容都是我干的。 我是一名探鬼主播芭概,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼赛不,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了罢洲?” 一聲冷哼從身側響起踢故,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惹苗,沒想到半個月后殿较,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡桩蓉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年淋纲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片院究。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡洽瞬,死狀恐怖,靈堂內的尸體忽然破棺而出业汰,到底是詐尸還是另有隱情伙窃,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布样漆,位于F島的核電站为障,受9級特大地震影響,放射性物質發(fā)生泄漏放祟。R本人自食惡果不足惜鳍怨,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跪妥。 院中可真熱鬧京景,春花似錦、人聲如沸骗奖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽执桌。三九已至鄙皇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仰挣,已是汗流浹背伴逸。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膘壶,地道東北人错蝴。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓洲愤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顷锰。 傳聞我的和親對象是個殘疾皇子丰歌,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內容