iOS 多線程之NSOperationQueue

NSOperationQueue和NSOperation

NSOperation

  • NSOperation類顶滩,在MVC中屬于M各拷,是用來封裝單個(gè)任務(wù)相關(guān)的代碼和數(shù)據(jù)的抽象類朦乏。
  • 因?yàn)樗浅橄蟮纳龋荒軌蛑苯邮褂眠@個(gè)類投放,而是使用子類NSInvocationOperation或NSBlockOperation來實(shí)際執(zhí)行任務(wù)。
  • NSOperation以及它的子類绒北,只是一個(gè)操作黎侈,本身無主線程和子線程之分∶朴危可在任意線程中使用峻汉,通常NSOperationQueue結(jié)合使用贴汪。

NSInvocationOperation

  • NSInvocationOperationNSOperation的子類。
  • 封裝了執(zhí)行操作的target和要執(zhí)行的action休吠。
  • 如果任務(wù)不在隊(duì)列中扳埂,那么就需要我們手動(dòng)啟動(dòng)任務(wù)。

使用NSInvocationOperation創(chuàng)建一個(gè)任務(wù)

NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:self 
selector:@selector(NSOperation) object:nil];
//手動(dòng)啟動(dòng)任務(wù)
[invocationOperation start];

NSBlockOperation

  • NSBlockOperationNSOperation的子類
  • 封裝了需要執(zhí)行的代碼塊
  • 如果任務(wù)不在隊(duì)列中蛛碌,那么就需要我們手動(dòng)啟動(dòng)任務(wù)聂喇。

使用NSBlockOperation創(chuàng)建一個(gè)任務(wù)

NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
     NSLog(@"-             ----block%@",[NSThread currentThread]);
}];
[blockOperation start];

NSOperationQueue

  • NSOperationQueue是操作隊(duì)列,它用來管理一組NSOperation對(duì)象的執(zhí)行蔚携。
  • 其中NSOperation可以調(diào)用它在隊(duì)列中的優(yōu)先級(jí)(使用addDependency:設(shè)置依賴關(guān)系)在我們希望某幾個(gè)任務(wù)執(zhí)行的時(shí)候有先后關(guān)系 希太,我們就可以為任務(wù)添加依賴。不能互相添加依賴酝蜒。
  • 通過設(shè)置最大并發(fā)數(shù)誊辉,讓一組任務(wù)可以有序的執(zhí)行 。最大并發(fā)數(shù)的默認(rèn)值為-1亡脑,意思為無限個(gè)堕澄。當(dāng)最大并發(fā)數(shù)設(shè)置為1的時(shí)候可以讓一組任務(wù)可以有序的執(zhí)行。
  • NSOperationQueue操作隊(duì)列霉咨,實(shí)現(xiàn)多線程的一種技術(shù)手段蛙紫,thread需要我們手動(dòng)的去管理內(nèi)存,隊(duì)列不需要途戒。thread每次只能開辟一個(gè)子線程坑傅,隊(duì)列可以調(diào)度,分配喷斋、管理多個(gè)線程唁毒。
  • NSOperationQueue隊(duì)列有兩種,一種是其他隊(duì)列星爪,一種是主隊(duì)列浆西。獲取主隊(duì)列的任務(wù)都是在主線程中執(zhí)行的,其他隊(duì)列中的任務(wù)都是在子線程中執(zhí)行的顽腾。

NSOperationQueue主隊(duì)列

創(chuàng)建任務(wù)并將任務(wù)添加進(jìn)主隊(duì)列中

示例代碼

- (void)mainQienestudy{
    NSOperationQueue *mainQuene = [NSOperationQueue mainQueue];
    NSBlockOperation *bloskOperation_0 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"1--------%@",[NSThread currentThread]);
    }];
    NSBlockOperation *bloskOperation_1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"2--------%@",[NSThread currentThread]);
    }];
    NSBlockOperation *bloskOperation_2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"3--------%@",[NSThread currentThread]);
    }];
    //將任務(wù)添加到主隊(duì)列中
    [mainQuene addOperation:bloskOperation_0];
    [mainQuene addOperation:bloskOperation_1];
    [mainQuene addOperation:bloskOperation_2];
}

NSOperationQueue其他隊(duì)列

創(chuàng)建任務(wù)并將任務(wù)添加進(jìn)其他隊(duì)列中

示例代碼

- (void)OperationQueueStudy{
//創(chuàng)建一個(gè)其他隊(duì)列近零,通過初始化方式創(chuàng)建的隊(duì)列只能是其他隊(duì)列
    NSOperationQueue *OtherQuene = [[NSOperationQueue alloc]init];
//隊(duì)列中只能添加任務(wù)
    NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@1",[NSThread currentThread]);
    }];
    NSBlockOperation *blockOperation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@2",[NSThread currentThread]);
    }];
    NSBlockOperation *blockOperation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@3",[NSThread currentThread]);
    }];
    NSBlockOperation *blockOperation4 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@4",[NSThread currentThread]);
    }];
    NSBlockOperation *blockOperation5 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@5",[NSThread currentThread]);
    }];
//希望某幾個(gè)任務(wù)執(zhí)行的時(shí)候有先后關(guān)系 ,我們就可以為任務(wù)添加依賴崔泵。不能互相添加依賴秒赤。
//    [blockOperation1 addDependency:blockOperation5];
//通過設(shè)置最大并發(fā)數(shù),讓一組任務(wù)可以有序的執(zhí)行 憎瘸。最大并發(fā)數(shù)的默認(rèn)值為-1,意思為無限個(gè)陈瘦。
    OtherQuene.maxConcurrentOperationCount = 1;
//將任務(wù)添加到隊(duì)列,在隊(duì)列中的任務(wù)不需要手動(dòng)啟動(dòng)幌甘。
    [OtherQuene addOperation:blockOperation1];
    [OtherQuene addOperation:blockOperation2];
    [OtherQuene addOperation:blockOperation3];
    [OtherQuene addOperation:blockOperation4];
    [OtherQuene addOperation:blockOperation5];
}

總結(jié)

只要是添加進(jìn)主隊(duì)列的任務(wù),一定是在主線程中進(jìn)行的,不管這個(gè)主隊(duì)列出現(xiàn)在哪里锅风。所以這也是一種從子隊(duì)列返回主隊(duì)列的方法酥诽,我們只需要在要返回主線程的子線程使用這個(gè)方法,就可以返回主隊(duì)列皱埠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肮帐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子边器,更是在濱河造成了極大的恐慌训枢,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘巧,死亡現(xiàn)場(chǎng)離奇詭異恒界,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砚嘴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門十酣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人际长,你說我怎么就攤上這事耸采。” “怎么了工育?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵虾宇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我翅娶,道長(zhǎng)文留,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任竭沫,我火速辦了婚禮燥翅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜕提。我一直安慰自己森书,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布谎势。 她就那樣靜靜地躺著凛膏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脏榆。 梳的紋絲不亂的頭發(fā)上猖毫,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音须喂,去河邊找鬼吁断。 笑死趁蕊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仔役。 我是一名探鬼主播掷伙,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼又兵!你這毒婦竟也來了任柜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤沛厨,失蹤者是張志新(化名)和其女友劉穎宙地,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俄烁,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绸栅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了页屠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粹胯。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辰企,靈堂內(nèi)的尸體忽然破棺而出风纠,到底是詐尸還是另有隱情,我是刑警寧澤牢贸,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布竹观,位于F島的核電站,受9級(jí)特大地震影響潜索,放射性物質(zhì)發(fā)生泄漏臭增。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一竹习、第九天 我趴在偏房一處隱蔽的房頂上張望誊抛。 院中可真熱鬧,春花似錦整陌、人聲如沸拗窃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽随夸。三九已至,卻和暖如春震放,著一層夾襖步出監(jiān)牢的瞬間宾毒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國打工殿遂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伍俘,地道東北人邪锌。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓勉躺,卻偏偏與公主長(zhǎng)得像癌瘾,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饵溅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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

  • 說到iOS多線程妨退,大部分人應(yīng)該立馬就想到了GCD(Grand Central Dispatch) ,因?yàn)镚CD使用...
    HK_Hank閱讀 8,127評(píng)論 2 29
  • 多線程 在iOS開發(fā)中為提高程序的運(yùn)行效率會(huì)將比較耗時(shí)的操作放在子線程中執(zhí)行蜕企,iOS系統(tǒng)進(jìn)程默認(rèn)啟動(dòng)一個(gè)主線程咬荷,用...
    郭豪豪閱讀 2,602評(píng)論 0 4
  • 多線程基本概念 單核CPU,同一時(shí)間cpu只能處理1個(gè)線程,只有1個(gè)線程在執(zhí)行 轻掩。多線程同時(shí)執(zhí)行:是CPU快速的在...
    WeiHing閱讀 709評(píng)論 1 5
  • NSThread 第一種:通過NSThread的對(duì)象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 805評(píng)論 0 3
  • 本文首發(fā)于我的個(gè)人博客:「程序員充電站」[https://itcharge.cn]文章鏈接:「?jìng)魉烷T」[https...
    ITCharge閱讀 110,212評(píng)論 135 749