iOS关于多线程任务执行顺序的浅研究

场景要求:要求请求A和请求B都都完成拿到结果,再执行C操作。

目前发现比较好的处理方法,共有三种,欢迎简友补充。

第一种方法:利用NSOperation

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
        // 异步发送请求A,得到结果
        NSLog(@"%s****当前线程:%@ 结果A",__func__,[NSThread currentThread]);
    }];
    
    NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
        // 异步发送请求,得到结果
        NSLog(@"%s****当前线程:%@ 结果B",__func__,[NSThread currentThread]);
    }];
    
//    [queue addOperation:operationA];
//    [queue addOperation:operationB];     // 此处会先执行NSlog ,再执行block(不满足项目要求)
    
    [queue addOperations:@[operationA,operationB] waitUntilFinished:YES]; // 此处会等待opertionA和B执行完毕,再执行NSLOG
    NSLog(@"执行到这里了么");

打印结果是:2016-12-08 11:16:46.490 testU[12234:249618] __37-[ViewController userOperationMethod]_block_invoke****当前线程:<NSThread: 0x7fd508715a20>{number = 3, name = (null)} 结果A
2016-12-08 11:16:46.490 testU[12234:249628] __37-[ViewController userOperationMethod]_block_invoke_2****当前线程:<NSThread: 0x7fd5086022b0>{number = 2, name = (null)} 结果B
2016-12-08 11:16:46.490 testU[12234:249458] 执行到这里了么

第二种方法 :利用RAC

- (void)userRACMethod
{
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 异步请求,得到结果resultA
        NSLog(@"%s****当前线程:%@ 结果A",__func__,[NSThread currentThread]); // 位于主线程 = 1
        [subscriber sendNext:@{@"value":@"resultA"}];
        return nil;
    }];
    
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // 异步请求,得到结果resultB
        NSLog(@"%s****当前线程:%@ 结果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(@"刷新页面数据%@\n%@",resultA,resultB);
    // 拿到上述A,B结果,执行其他操作 ......
}

第三种方法:利用队列组

// *** 利用队列组 ****//
- (void)userGroupMethod
{
    // 创建队列组
    dispatch_group_t myGroup = dispatch_group_create();
    // 创建并发队列
    dispatch_queue_t myQueue = dispatch_queue_create(0, 0);
    // 使用函数添加任务(所有任务都是并发执行)
    /**
     *  任务A
     */
    dispatch_group_enter(myGroup);
    dispatch_async(myQueue, ^{
        // 请求A
        
        if (success) {
            // 请求成功
            dispatch_group_leave(myGroup);

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

        }
    });
    
    /**
     *  任务B
     */
    dispatch_group_enter(myGroup);
    dispatch_async(myQueue, ^{
        // 请求B
        
        if (success) {
            // 请求成功
            dispatch_group_leave(myGroup);
            
        }else{
            // 失败
            dispatch_group_leave(myGroup);
            
        }
    });
    
    // A,B执行完毕,不论成功失败。只要执行完毕就执行下方代码
    dispatch_group_notify(myGroup, myQueue, ^{
        // 执行C操作。注意刷新UI等需要回到主线程。
        dispatch_async(dispatch_get_main_queue(), ^{
            // 刷新等操作。
        });
        
    });
}

欢迎指正添加。接下来还要抽出一部分时间专门研究下多线程,感觉多线程真是博大精深。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、前言 上一篇文章iOS多线程浅汇-原理篇中整理了一些有关多线程的基本概念。本篇博文介绍的是iOS中常用的几个多...
    nuclear阅读 2,070评论 6 18
  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    伯恩的遗产阅读 274,801评论 251 2,331
  • 一、前言 本篇博文介绍的是iOS中常用的几个多线程技术: NSThread GCD NSOperation 由于a...
    和珏猫阅读 585评论 0 1
  • 日就月将
    健壮的小牛阅读 467评论 0 0
  • 第七章 我要上山海榜(下) 穆昆仑眼神微微撇了一眼玉无瑕,少女的脸上充满着对于至尊陛下的憧憬与尊敬。 如此厉害的...
    木偶freed阅读 340评论 0 1