iOS關(guān)于多線程任務(wù)執(zhí)行順序的淺研究

場(chǎng)景要求:要求請(qǐng)求A和請(qǐng)求B都都完成拿到結(jié)果,再執(zhí)行C操作。

目前發(fā)現(xiàn)比較好的處理方法,共有三種,歡迎簡(jiǎn)友補(bǔ)充。

第一種方法:利用NSOperation

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
        // 異步發(fā)送請(qǐng)求A,得到結(jié)果
        NSLog(@"%s****當(dāng)前線程:%@ 結(jié)果A",__func__,[NSThread currentThread]);
    }];
    
    NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
        // 異步發(fā)送請(qǐng)求,得到結(jié)果
        NSLog(@"%s****當(dāng)前線程:%@ 結(jié)果B",__func__,[NSThread currentThread]);
    }];
    
//    [queue addOperation:operationA];
//    [queue addOperation:operationB];     // 此處會(huì)先執(zhí)行NSlog ,再執(zhí)行block(不滿足項(xiàng)目要求)
    
    [queue addOperations:@[operationA,operationB] waitUntilFinished:YES]; // 此處會(huì)等待opertionA和B執(zhí)行完畢,再執(zhí)行NSLOG
    NSLog(@"執(zhí)行到這里了么");

打印結(jié)果是:2016-12-08 11:16:46.490 testU[12234:249618] __37-[ViewController userOperationMethod]_block_invoke****當(dāng)前線程:<NSThread: 0x7fd508715a20>{number = 3, name = (null)} 結(jié)果A
2016-12-08 11:16:46.490 testU[12234:249628] __37-[ViewController userOperationMethod]_block_invoke_2****當(dāng)前線程:<NSThread: 0x7fd5086022b0>{number = 2, name = (null)} 結(jié)果B
2016-12-08 11:16:46.490 testU[12234:249458] 執(zhí)行到這里了么

第二種方法 :利用RAC

- (void)userRACMethod
{
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 異步請(qǐng)求,得到結(jié)果resultA
        NSLog(@"%s****當(dāng)前線程:%@ 結(jié)果A",__func__,[NSThread currentThread]); // 位于主線程 = 1
        [subscriber sendNext:@{@"value":@"resultA"}];
        return nil;
    }];
    
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 異步請(qǐng)求,得到結(jié)果resultB
        NSLog(@"%s****當(dāng)前線程:%@ 結(jié)果B",__func__,[NSThread currentThread]); // 位于主線程 = 1
        [subscriber sendNext:@{@"haha":@"resultB"}];
        return nil;
    }];
    
    [self rac_liftSelector:@selector(updateUIWithResultA:ResultB:) withSignalsFromArray:@[signalA,signalB]];
}

- (void)updateUIWithResultA:(NSDictionary *)resultA ResultB:(NSDictionary *)resultB
{
    NSLog(@"刷新頁面數(shù)據(jù)%@\n%@",resultA,resultB);
    // 拿到上述A,B結(jié)果,執(zhí)行其他操作 ......
}

第三種方法:利用隊(duì)列組

// *** 利用隊(duì)列組 ****//
- (void)userGroupMethod
{
    // 創(chuàng)建隊(duì)列組
    dispatch_group_t myGroup = dispatch_group_create();
    // 創(chuàng)建并發(fā)隊(duì)列
    dispatch_queue_t myQueue = dispatch_queue_create(0, 0);
    // 使用函數(shù)添加任務(wù)(所有任務(wù)都是并發(fā)執(zhí)行)
    /**
     *  任務(wù)A
     */
    dispatch_group_enter(myGroup);
    dispatch_async(myQueue, ^{
        // 請(qǐng)求A
        
        if (success) {
            // 請(qǐng)求成功
            dispatch_group_leave(myGroup);

        }else{
            // 失敗
            dispatch_group_leave(myGroup);

        }
    });
    
    /**
     *  任務(wù)B
     */
    dispatch_group_enter(myGroup);
    dispatch_async(myQueue, ^{
        // 請(qǐng)求B
        
        if (success) {
            // 請(qǐng)求成功
            dispatch_group_leave(myGroup);
            
        }else{
            // 失敗
            dispatch_group_leave(myGroup);
            
        }
    });
    
    // A,B執(zhí)行完畢,不論成功失敗。只要執(zhí)行完畢就執(zhí)行下方代碼
    dispatch_group_notify(myGroup, myQueue, ^{
        // 執(zhí)行C操作。注意刷新UI等需要回到主線程。
        dispatch_async(dispatch_get_main_queue(), ^{
            // 刷新等操作。
        });
        
    });
}

歡迎指正添加。接下來還要抽出一部分時(shí)間專門研究下多線程,感覺多線程真是博大精深。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關(guān)多線程的基本概念。本篇博文介紹的是iOS中常用的幾個(gè)多...
    nuclear閱讀 2,144評(píng)論 6 18
  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項(xiàng)。當(dāng)然也會(huì)給出幾種多線程的案...
    伯恩的遺產(chǎn)閱讀 275,619評(píng)論 251 2,329
  • 一、前言 本篇博文介紹的是iOS中常用的幾個(gè)多線程技術(shù): NSThread GCD NSOperation 由于a...
    和玨貓閱讀 659評(píng)論 0 1
  • 日就月將
    健壯的小牛閱讀 475評(píng)論 0 0
  • 第七章 我要上山海榜(下) 穆昆侖眼神微微撇了一眼玉無瑕,少女的臉上充滿著對(duì)于至尊陛下的憧憬與尊敬。 如此厲害的...
    木偶freed閱讀 387評(píng)論 0 1

友情鏈接更多精彩內(nèi)容