多線程之NSOperationQueue坪圾,與GCD的對(duì)比

NSOperationQueue與GCD是伯仲之間嗎

事實(shí):GCD是面向底層的C語言的API一睁, NSOperationQueue是基于GCD面向OC的封裝
結(jié)果:
1)GCD執(zhí)行效率更高
2)GCD只支持FIFO的隊(duì)列冈闭,而NSOperationQueue可以通過設(shè)置最大并發(fā)數(shù)赚窃,設(shè)置優(yōu)先級(jí)册招,添加依賴關(guān)系等調(diào)整執(zhí)行順序
3)NSOperationQueue甚至可以跨隊(duì)列設(shè)置依賴關(guān)系,但是GCD只能通過設(shè)置串行隊(duì)列勒极,或者在隊(duì)列內(nèi)添加barrier(dispatch_barrier_async)任務(wù)是掰,才能控制執(zhí)行順序,較為復(fù)雜

  1. NSOperationQueue因?yàn)槊嫦驅(qū)ο螅灾С諯VO辱匿,可以監(jiān)測operation是否正在執(zhí)行(isExecuted)键痛、是否結(jié)束(isFinished)炫彩、是否取消(isCanceld)
NSOperationQueue的API
  • start,開啟任務(wù),當(dāng)把NSOperation添加到NSOperationQueue中去后絮短,隊(duì)列會(huì)在操作中調(diào)用start方法江兢。這里沒有添加到NSOperationQueue中,手動(dòng)start丁频,默認(rèn)在主隊(duì)列中
    //start 開啟任務(wù)划址,默認(rèn)主隊(duì)列
    NSBlockOperation *operationOne = [NSBlockOperation blockOperationWithBlock:^{\
        for (int i=0; i<3; i++) {
            NSLog(@"=%@=====%d",[NSThread currentThread],i);
        }
    }];
    [operationOne start];
  • addOperation或者addOperationWithBlock , 只要是自己創(chuàng)建的隊(duì)列限府,就會(huì)在子線程中執(zhí)行,默認(rèn)并發(fā)痢缎,設(shè)置maxConcurrentOperationCount為 1 時(shí)是串行執(zhí)行
   //主隊(duì)列
    NSOperationQueue *mainqueue = [NSOperationQueue mainQueue];

    //自己創(chuàng)建的隊(duì)列
    NSOperationQueue *customQueue = [[NSOperationQueue alloc]init];
    customQueue.maxConcurrentOperationCount = 2; //最大并發(fā)數(shù)

    //只要是自己創(chuàng)建的隊(duì)列胁勺,就會(huì)在子線程中執(zhí)行,默認(rèn)并發(fā)独旷,設(shè)置maxConcurrentOperationCount時(shí)是串行執(zhí)行
    [customQueue addOperationWithBlock:^{
       //向隊(duì)列中添加block異步任務(wù)
        for (int i=3; i<6; i++) {
            NSLog(@"=%@=====%d",[NSThread currentThread],i);

        }
    }];
    
    [customQueue addOperationWithBlock:^{
        //向隊(duì)列中添加block異步任務(wù)
        for (int i=6; i<9; i++) {
            NSLog(@"=%@=====%d",[NSThread currentThread],i);
        }
    }];
    
    //添加 NSInvocationOperation
    [customQueue addOperation:[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocationOperationDeal) object:nil]];
    
  • 隊(duì)列控制API
    //將隊(duì)列中任務(wù)暫停
    customQueue.suspended = YES;
    
    //將隊(duì)列中任務(wù)恢復(fù)執(zhí)行
    customQueue.suspended = NO;
    
    //取消隊(duì)列中的所有任務(wù)
    [customQueue cancelAllOperations];
  • addDependency 添加依賴署穗,removeDependency刪除依賴,
    //任務(wù)之間添加依賴嵌洼,比如當(dāng)前一個(gè)任務(wù)的返回結(jié)果  是 后一個(gè)任務(wù)的所需元素時(shí)
    NSBlockOperation *blockOp1 = [NSBlockOperation blockOperationWithBlock:^{
       //計(jì)算出小明的臉部數(shù)據(jù)
    }];
    
    NSBlockOperation *blockOp2 = [NSBlockOperation blockOperationWithBlock:^{
       //計(jì)算出小明的頭圍數(shù)據(jù)
    }];
    
    NSBlockOperation *blockOp3 = [NSBlockOperation blockOperationWithBlock:^{
       // 制作出小明的頭部模型
    }];
    [blockOp3 addDependency:blockOp1];
    [blockOp3 addDependency:blockOp2];  //blockOp3的操作依賴于 1 和 2 的結(jié)果
    [customQueue addOperations:@[blockOp1,blockOp2,blockOp3] waitUntilFinished:NO];
  • setQueuePriority案疲,設(shè)置優(yōu)先級(jí), 當(dāng)你添加一個(gè)操作到一個(gè)隊(duì)列時(shí),在對(duì)操作調(diào)用start之前麻养,NSOperationQueue會(huì)瀏覽所有的操作褐啡,具有較高優(yōu)先級(jí)的操作會(huì)優(yōu)先執(zhí)行,具有相同優(yōu)先級(jí)的操作會(huì)按照添加到隊(duì)列中順序執(zhí)行鳖昌。
[a setQueuePriority:NSOperationQueuePriorityVeryLow];
一共有四個(gè)優(yōu)先級(jí):
NSOperationQueuePriorityLow备畦,
NSOperationQueuePriorityNormal,
NSOperationQueuePriorityHigh许昨,
NSOperationQueuePriorityVeryHigh
  • setCompletionBlock 設(shè)置完成回調(diào)
 [blockOp2 setCompletionBlock:^{
        //blockOp2任務(wù)執(zhí)行完成懂盐,此block在主線程執(zhí)行
 }];
小結(jié)

1、實(shí)際項(xiàng)目開發(fā)中糕档,很多時(shí)候只是會(huì)用到異步操作莉恼,不會(huì)有特別復(fù)雜的線程關(guān)系管理,所以蘋果推崇的且優(yōu)化完善速那、運(yùn)行快速的GCD是首選

2俐银、如果涉及到類似多線程并發(fā)下載,這種多任務(wù)還要控制任務(wù)進(jìn)度的情況琅坡,可能就要考慮使用易于管理的NSOperationQueue了悉患,關(guān)于自定義NSOperation的內(nèi)容,后續(xù)我會(huì)另寫一篇文章的榆俺,繼續(xù)學(xué)習(xí)

3售躁、另外不論是GCD還是NSOperationQueue坞淮,我們接觸的都是任務(wù)和隊(duì)列,都沒有直接接觸到線程這個(gè)東東陪捷,事實(shí)上線程管理也的確不需要我們操心回窘,系統(tǒng)對(duì)于線程的創(chuàng)建,調(diào)度管理和釋放都做得很好市袖。但是有一個(gè)線程類NSThread可以滿足我們對(duì)于線程的好奇心啡直,但是NSThread需要我們自己去管理線程的生命周期,還要考慮線程同步苍碟、加鎖問題酒觅,造成一些性能上的開銷

附圖,這張圖如此之精辟微峰,讓我久久挪不開眼睛


03C5DAFC-D70B-4D8B-8805-41711EBDEC1C.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舷丹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜓肆,更是在濱河造成了極大的恐慌颜凯,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仗扬,死亡現(xiàn)場離奇詭異症概,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)早芭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門彼城,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逼友,你說我怎么就攤上這事精肃。” “怎么了帜乞?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵司抱,是天一觀的道長。 經(jīng)常有香客問我黎烈,道長习柠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任照棋,我火速辦了婚禮资溃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烈炭。我一直安慰自己溶锭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布符隙。 她就那樣靜靜地躺著趴捅,像睡著了一般垫毙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拱绑,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天综芥,我揣著相機(jī)與錄音,去河邊找鬼猎拨。 笑死膀藐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的红省。 我是一名探鬼主播额各,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吧恃!你這毒婦竟也來了臊泰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤蚜枢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后针饥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厂抽,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年丁眼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筷凤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苞七,死狀恐怖藐守,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹂风,我是刑警寧澤卢厂,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站惠啄,受9級(jí)特大地震影響慎恒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撵渡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一融柬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趋距,春花似錦粒氧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摘盆。三九已至,卻和暖如春门怪,著一層夾襖步出監(jiān)牢的瞬間骡澈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工掷空, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肋殴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓坦弟,卻偏偏與公主長得像护锤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酿傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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