java - 发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?
天蓬老师
天蓬老师 2017-04-17 16:15:12
0
21
1575

我想到的

for iOS
1.用dispatch_group实现
2.用RunLoop实现   

还有没有其他的比较好的实现方式,求关于并发编程的文章.

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(21)
刘奇

有人说了 NSOperation,我就不说了。
但我更喜欢 GCD。这个问题可以用 barrier 解决:

    dispatch_queue_t queue = dispatch_queue_create("JOHNSHAW", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        NSLog(@"task 1");
        sleep(1);
    });
    dispatch_async(queue, ^{
        NSLog(@"task 2");
        sleep(1);
    });
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"after task 1 and task 2");
        sleep(1);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"do someting else");
    });

其实我更喜欢 RAC,不过 RAC 毕竟是个重型框架,用的公司并不多

    RACSignal *task1 = ...;
    RACSignal *task2 = ...;
    
    [[RACSignal combineLatest:@[task1,task2]] subscribeNext:^(id x) {
        NSLog(@"after task1 and task2 ");
    }];
阿神

用RxAndroid。一个.zip方法就搞定了。。

洪涛

比较好的方式使用NSOperation 因为有addDependecy方法~

洪涛

For javascript:

  1. https://github.com/caolan/async
    处理异步的并行与串行都很方便

  2. 用jQuery的Promise, 或其它库的Promise实现 :)

Ty80

借鉴下map reduce方法,类似于归并排序的思路

迷茫

正常使用 dispatch_group_wait 和 dispatch_group_notify 就好了。

还可以使用 dispatch_barrier_sync / dispatch_barrier_async,将收到所有响应之后的操作用作 barrier block,那么这个 block 就会等待所有网络请求结束之后再执行。

黄舟

不知道你问的Android还是iOS, 如果是Android用CountDownLatch来控制线程吧

PHPzhong

java的话,用concurrent包的future api可以实现多线程分别请求,然后全部响应后处理结果。

左手右手慢动作

for iOS
创建一个串行队列处理。不影响外部并发请求。

黄舟

JS中如何实现呢?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板