美文网首页IOS
iOS关于多线程任务执行顺序的浅研究

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

作者: 赵先生咯 | 来源:发表于2016-12-08 14:40 被阅读1077次

    场景要求:要求请求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关于多线程任务执行顺序的浅研究

        本文链接:https://www.haomeiwen.com/subject/phlsmttx.html