多線程技術(shù)之NSOperation

前面介紹了ios中三種多線程技術(shù)的NSThread,本文將繼續(xù)介紹NSOperation的使用纫事。

環(huán)境信息:
Mac OS X 10.10.1
Xcode 6.1.1
iOS 8.1

正文:
一渗鬼、NSOperation的簡(jiǎn)介
NSOperation的抽象程度高于NSThread览露,它是蘋果對(duì)線程的一個(gè)面向?qū)ο蠓庋b。NSOperation表示一個(gè)獨(dú)立的計(jì)算單元譬胎,作為一個(gè)抽象類差牛,你需要實(shí)例話他的子類 ?NSInvocationOperation / ?NSBlockOperation 來(lái)進(jìn)行具體操作命锄。實(shí)例化之后,調(diào)用start方法或者加入到一個(gè)NSOperationQueue 操作隊(duì)列中偏化,就可以開(kāi)始執(zhí)行脐恩。

二、NSOperation的使用
1.直接啟動(dòng)一個(gè)NSInvocationOperation


// 如果直接調(diào)用operation的start方法侦讨,是在主線程上運(yùn)行驶冒,不會(huì)開(kāi)啟新的線程
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];
[op start];

2.使用NSOperationQueue管理NSOperation并開(kāi)啟一個(gè)異步線程

// 定義操作隊(duì)列屬性
@property (strong, nonatomic) NSOperationQueue *queue;
// 實(shí)例化操作隊(duì)列
self.queue = [[NSOperationQueue alloc] init];
// 初始化一個(gè)NSInvocationOperation
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];

// 將NSInvocationOperation添加到隊(duì)列,一添加到隊(duì)列搭伤,就會(huì)開(kāi)啟新線程執(zhí)行任務(wù)只怎,不可以同時(shí)使用start
[self.queue addOperation:op];

3.使用NSOperationQueue管理并NSBlockOperation開(kāi)啟一個(gè)線程

NSBlockOperation與NSInvocationOperation沒(méi)有什么本質(zhì)差別,只是NSBlockOperation使用代碼塊會(huì)更方便一些

// 初始化一個(gè)NSBlockOperation
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
    // 異步操作
    [self operationLoadImage:imageView];
}];
// 添加操作到隊(duì)列中
[self.queue addOperation:op];

4.在主線程中執(zhí)行操作

// 在主線程隊(duì)列上更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [imageView setImage:image];
}];

5.添加線程之間的依賴關(guān)系

直接在隊(duì)列中添加操作會(huì)并發(fā)執(zhí)行怜俐,誰(shuí)先誰(shuí)后是系統(tǒng)調(diào)用的身堡,在特定的時(shí)候我們需要控制操作的執(zhí)行順序,就會(huì)使用到addDependency操作拍鲤。addDependency: 是NSOperation的成員方法贴谎,調(diào)用該方法的NSOperation對(duì)象將在參數(shù)執(zhí)行完成之后執(zhí)行。需要先添加依賴關(guān)系季稳,再將操作添加到隊(duì)列中擅这。

// 初始化三個(gè)塊操作
NSBlockOperation *op1 =[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"下載 %@", [NSThread currentThread]);
}];

NSBlockOperation *op2 =[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"美化 %@", [NSThread currentThread]);
}];

NSBlockOperation *op3 =[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"更新 %@", [NSThread currentThread]);
}];

// 通過(guò)添加依賴可以控制線程執(zhí)行順序,依賴關(guān)系可以多重依賴
// 注意:不要建立循環(huán)依賴景鼠,會(huì)造成死鎖
[op2 addDependency:op1];
[op3 addDependency:op2];

// 直接加到隊(duì)列里面會(huì)并發(fā)執(zhí)行仲翎,誰(shuí)先先后是系統(tǒng)調(diào)用決定
[self.queue addOperation:op3];
[self.queue addOperation:op1];
[self.queue addOperation:op2];

6.控制線程并發(fā)數(shù)

// 并發(fā)的線程越多越耗資源,隊(duì)列可以設(shè)置同時(shí)并發(fā)線程的數(shù)量铛漓,來(lái)進(jìn)行控制
self.queue.maxConcurrentOperationCount = 1;

7.取消一個(gè)操作

NSOperation里有一系列的屬性用來(lái)標(biāo)明自身狀態(tài)的溯香,isReady → ?isExecuting →??isFinish。線程start后并不是立即執(zhí)行浓恶,而是進(jìn)入一個(gè)就緒的狀態(tài)(isReady)玫坛,由系統(tǒng)調(diào)度執(zhí)行。有時(shí)可能需要進(jìn)行取消操作包晰,可以調(diào)用– (void)cancel; 來(lái)停止一些還未執(zhí)行的不必要的線程湿镀。

for (NSOperation *operation in self.queue.operations) {
    // 取消一個(gè)NSOperation
    [operation cancel];
}

8.給NSOperation添加完成代碼塊

比如在下載一本小說(shuō)結(jié)束的時(shí)候,你需要發(fā)個(gè)通知告訴用戶已經(jīng)下載完畢伐憾,這時(shí)就可以使用NSOperation的completionBlock屬性來(lái)執(zhí)行操作勉痴。

operation.completionBlock = ^{
   NSLog(@"完成");
};

9.優(yōu)先級(jí)

同NSThread一樣,NSOperation可以通過(guò)threadPriority屬性來(lái)指定優(yōu)先級(jí)塞耕。但是在IOS8蚀腿,線程這個(gè)概念已經(jīng)被蘋果框架系統(tǒng)性的忽略了,threadPriority已由NSQualityOfService屬性替代,下面是NSQualityOfService的幾個(gè)幾個(gè)枚舉莉钙。

typedef NS_ENUM(NSInteger, NSQualityOfService) {
    /* 和圖形處理相關(guān)的任務(wù)廓脆,比如滾動(dòng)和動(dòng)畫 */
    NSQualityOfServiceUserInteractive = 0x21,

    /* 用戶請(qǐng)求的任務(wù),但是不需要精確到毫秒級(jí)磁玉。例如如果用戶請(qǐng)求打開(kāi)電子郵件App來(lái)查看郵件 */
    NSQualityOfServiceUserInitiated = 0x19,

    /* 周期性的用戶請(qǐng)求任務(wù)停忿。比如,電子郵件App可能被設(shè)置成每5分鐘自動(dòng)檢測(cè)新郵件蚊伞。但是在系統(tǒng)資源極度匱乏的時(shí)候席赂,將這個(gè)周期性的任務(wù)推遲幾分鐘也沒(méi)有大礙*/
    NSQualityOfServiceUtility = 0x11,
   
    /* 后臺(tái)任務(wù),對(duì)這些任務(wù)用戶可能并不會(huì)察覺(jué)时迫,比如電子郵件App對(duì)郵件進(jìn)行索引以方便搜索 */
    NSQualityOfServiceBackground = 0x09,
   
    /* 默認(rèn)的優(yōu)先級(jí) */
    NSQualityOfServiceDefault = -1
} NS_ENUM_AVAILABLE(10_10, 8_0);

三颅停、NSOperation小結(jié)

1.NSOperation方便控制線程執(zhí)行順序

2.使用NSBlockOperation可以使用塊代碼,不必單寫線程方法掠拳,便于傳遞多個(gè)參數(shù)

3.可以控制線程并發(fā)數(shù)癞揉,有效地對(duì)線程進(jìn)行控制

4.可以添加線程完成代碼塊,執(zhí)行需要的操作

雖然GCD已經(jīng)成為流行溺欧, 但是在某些框架中喊熟,例如AFNetworking還是使用的NSOperation來(lái)完成線程相關(guān)的操作,除了使用框架的NSInvocationOperation / ?NSBlockOperation 來(lái)處理線程操作姐刁,你也可以通過(guò)集成來(lái)完成你需要的操作芥牌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市聂使,隨后出現(xiàn)的幾起案子壁拉,更是在濱河造成了極大的恐慌,老刑警劉巖柏靶,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扇商,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡宿礁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門蔬芥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梆靖,“玉大人,你說(shuō)我怎么就攤上這事笔诵》滴牵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵乎婿,是天一觀的道長(zhǎng)测僵。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么捍靠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任沐旨,我火速辦了婚禮,結(jié)果婚禮上榨婆,老公的妹妹穿的比我還像新娘磁携。我一直安慰自己,他們只是感情好良风,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布谊迄。 她就那樣靜靜地躺著,像睡著了一般烟央。 火紅的嫁衣襯著肌膚如雪统诺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天疑俭,我揣著相機(jī)與錄音粮呢,去河邊找鬼。 笑死怠硼,一個(gè)胖子當(dāng)著我的面吹牛鬼贱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播香璃,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼这难,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了葡秒?” 一聲冷哼從身側(cè)響起姻乓,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眯牧,沒(méi)想到半個(gè)月后蹋岩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡学少,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年剪个,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片版确。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扣囊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绒疗,到底是詐尸還是另有隱情侵歇,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布吓蘑,位于F島的核電站惕虑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溃蔫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一健提、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酒唉,春花似錦矩桂、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至网沾,卻和暖如春癞蚕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辉哥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工桦山, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人醋旦。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓恒水,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饲齐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钉凌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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