iOS中NSOperation使用

在前面介紹了
NSThread的使用 贸辈,
GCD的使用释树,
接下來我們將介紹NSOperation的使用

簡介

在iOS的多線程開發(fā)過程中,不可避免的要使用多線程擎淤,多線程可以在不阻塞主線程的前提下提高效率奢啥。在這里呢,我們將看看多線程中NSOperation是如何使用的嘴拢。

NSInvocationOperation

The NSInvocationOperation class is a concrete subclass of NSOperation that you use to initiate an operation that consists of invoking a selector on a specified object. This class implements a non-concurrent operation.
根據(jù)蘋果官方的解釋說桩盲,NSInvocationOperationNSOperation一個子類,你可以初始化一個操作席吴,該操作在一個指定的對象上去調(diào)用一個selector赌结,并且NSOperation這個類實(shí)現(xiàn)了一個非并發(fā)的操作。具體怎么使用NSInvocationOperation這個類呢孝冒?

NSInvocationOperation的創(chuàng)建

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationTest) object:nil];

NSInvocationOperation創(chuàng)建完成之后柬姚,怎么觸發(fā)該線程的執(zhí)行?一共有兩種方式執(zhí)行該線程
方式一:

//調(diào)用start方法執(zhí)行庄涡,此執(zhí)行方式在主線程中執(zhí)行量承,沒有開辟新的線程
//    ThreadDemo[20397:12090175] ------------<NSThread: 0x60400007da00>{number = 1, name = main}-----
        [operation start];

調(diào)用start方法執(zhí)行此線程,但是使用此方法穴店,并不會開辟新的線程來執(zhí)行代碼
方式二:

    //加入到隊(duì)列中去執(zhí)行撕捍,此種方式會開辟線程,在新的線程中執(zhí)行代碼
//    ThreadDemo[20432:12091400] ------------<NSThread: 0x600000273240>{number = 3, name = (null)}-----
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation];

根據(jù)打印信息可以看出泣洞,把創(chuàng)建的NSInvocationOperation加入到一個queue隊(duì)列中去執(zhí)行忧风,會開辟新的線程執(zhí)行任務(wù)。

NSBlockOperation

The NSBlockOperation class is a concrete subclass of NSOperationthat manages the concurrent execution of one or more blocks. You can use this object to execute several blocks at once without having to create separate operation objects for each. When executing more than one block, the operation itself is considered finished only when all blocks have finished executing.
NSBlockOperation類是NSOperation的一個具體子類球凰,它管理一個或多個塊的并發(fā)執(zhí)行阀蒂。您可以使用這個對象一次執(zhí)行幾個塊,而不必為每個塊創(chuàng)建單獨(dú)的操作對象弟蚀。當(dāng)執(zhí)行多個塊時蚤霞,只有當(dāng)所有塊都完成執(zhí)行時,才考慮操作本身义钉。

NSBlockOperation的創(chuàng)建

 //創(chuàng)建NSBlockOperation線程方式1
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"------operation------%@-----", [NSThread currentThread]);
    }];
    [operation start];
    //創(chuàng)建NSBlockOperation線程方式2
    NSBlockOperation *operation1 = [[NSBlockOperation alloc] init];
    [operation1 addExecutionBlock:^{
        NSLog(@"------operation1------%@-----", [NSThread currentThread]);
    }];
    [operation1 start];

這樣創(chuàng)建后調(diào)用start方法昧绣,同樣在主線程中執(zhí)行,下面看看把NSBlockOperation添加到queue隊(duì)列中去執(zhí)行

    NSBlockOperation *operation = [[NSBlockOperation alloc] init];
    [operation addExecutionBlock:^{
        NSLog(@"------block1------%@-----", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        NSLog(@"------block2------%@-----", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        NSLog(@"------block3------%@-----", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        NSLog(@"------block4------%@-----", [NSThread currentThread]);
    }];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation];

可以看出捶闸,加入到queue隊(duì)列中的任務(wù)全都是異步執(zhí)行

使用NSOperationQueue來創(chuàng)建任務(wù)

/**
 使用queue隊(duì)列來自己添加任務(wù)并執(zhí)行
 */
- (void)testOperationQueue {
    //創(chuàng)建queue隊(duì)列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //添加任務(wù)
    [queue addOperationWithBlock:^{
        NSLog(@"------block1------%@-----", [NSThread currentThread]);
    }];
    [queue addOperationWithBlock:^{
        NSLog(@"------block2------%@-----", [NSThread currentThread]);
    }];
    [queue addOperationWithBlock:^{
        NSLog(@"------block3------%@-----", [NSThread currentThread]);
    }];
    [queue addOperationWithBlock:^{
        NSLog(@"------block4------%@-----", [NSThread currentThread]);
    }];
}

可以看出夜畴,使用queue隊(duì)列來創(chuàng)建任務(wù)拖刃,省去了創(chuàng)建NSInvocationOperationNSBlockOperation再加入到隊(duì)列中執(zhí)行。
上面列出了三種實(shí)現(xiàn)NSOperation創(chuàng)建多線程的方式贪绘,在具體的工作中兑牡,使用哪種方式還是要根據(jù)工作需要具體對待。

隊(duì)列的使用----依賴執(zhí)行任務(wù)

有這個一個場景:任務(wù)3的執(zhí)行依賴于任務(wù)2税灌,任務(wù)2的執(zhí)行依賴于任務(wù)1均函,相當(dāng)于一個串行隊(duì)列,只有當(dāng)前面一個執(zhí)行完成之后才開始下一個任務(wù)的執(zhí)行菱涤,下面看看具體的實(shí)現(xiàn)方式:

/**
 使用場景一:任務(wù)的依賴執(zhí)行
 */
- (void)testDepenceyOperation {
    //創(chuàng)建要執(zhí)行的任務(wù)
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"------operation1------%@-----", [NSThread currentThread]);
    }];
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"------operation2------%@-----", [NSThread currentThread]);
    }];
    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"------operation3------%@-----", [NSThread currentThread]);
    }];
    //給任務(wù)添加依賴苞也,任務(wù)3依賴任務(wù)2,任務(wù)2依賴任務(wù)1
    [operation3 addDependency:operation2];
    [operation2 addDependency:operation1];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
}

隊(duì)列的使用---設(shè)置最大并發(fā)數(shù)

設(shè)置最大并發(fā)數(shù)量粘秆,為了保證app的整個生命周期不會占用過多的資源如迟,在有大量并發(fā)線程執(zhí)行的時候,一定要進(jìn)行設(shè)置攻走,不然可能會造成app閃退殷勘。

- (void)testMacConcurrentOperationCount {
    //創(chuàng)建queue隊(duì)列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //設(shè)置線程的最大并發(fā)數(shù)量
    queue.maxConcurrentOperationCount = 3;
    //添加任務(wù)
    [queue addOperationWithBlock:^{
        NSLog(@"------block1------%@-----", [NSThread currentThread]);
    }];
    [queue addOperationWithBlock:^{
        NSLog(@"------block2------%@-----", [NSThread currentThread]);
    }];
    [queue addOperationWithBlock:^{
        NSLog(@"------block3------%@-----", [NSThread currentThread]);
    }];
    [queue addOperationWithBlock:^{
        NSLog(@"------block4------%@-----", [NSThread currentThread]);
    }];
    [queue addOperationWithBlock:^{
        NSLog(@"------block5------%@-----", [NSThread currentThread]);
    }];
    [queue addOperationWithBlock:^{
        NSLog(@"------block6------%@-----", [NSThread currentThread]);
    }];
    [queue addOperationWithBlock:^{
        NSLog(@"------block7------%@-----", [NSThread currentThread]);
    }];
}

最后附上以上代碼鏈接

上述所有代碼均可以在NSOperationDemo中查看,有需要可以自行獲取

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昔搂,一起剝皮案震驚了整個濱河市劳吠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巩趁,老刑警劉巖痒玩,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異议慰,居然都是意外死亡蠢古,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門别凹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來草讶,“玉大人,你說我怎么就攤上這事炉菲《檎剑” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵拍霜,是天一觀的道長嘱丢。 經(jīng)常有香客問我,道長祠饺,這世上最難降的妖魔是什么越驻? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上缀旁,老公的妹妹穿的比我還像新娘记劈。我一直安慰自己,他們只是感情好并巍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布目木。 她就那樣靜靜地躺著,像睡著了一般懊渡。 火紅的嫁衣襯著肌膚如雪塞颁。 梳的紋絲不亂的頭發(fā)上达吞,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天轴术,我揣著相機(jī)與錄音隅茎,去河邊找鬼井佑。 笑死妻导,一個胖子當(dāng)著我的面吹牛基茵,可吹牛的內(nèi)容都是我干的椿访。 我是一名探鬼主播漓拾,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼阁最,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骇两?” 一聲冷哼從身側(cè)響起速种,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎低千,沒想到半個月后配阵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡示血,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年棋傍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片难审。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘫拣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出告喊,到底是詐尸還是另有隱情麸拄,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布黔姜,位于F島的核電站拢切,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秆吵。R本人自食惡果不足惜失球,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧实苞,春花似錦豺撑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猾浦,卻和暖如春陆错,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背金赦。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工音瓷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夹抗。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓绳慎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親漠烧。 傳聞我的和親對象是個殘疾皇子杏愤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

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