iOS 多个网络请求并发执行的解决方案

使用GCD调度组

https://www.jianshu.com/p/752e24029268

使用信号量

dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_semaphore_signal(sem);
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

对这三句代码可以这样理解:dispatch_semaphore信号量为基于计数器的一种多线程同步机制。如果semaphore计数大于等于1,计数-1,返回,程序继续运行。如果计数为0,则等待。dispatch_semaphore_signal(semaphore)为计数+1操作,dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER)为设置等待时间,这里设置的等待时间是一直等待。
对于以上代码通俗一点就是,开始为0,等待,等10个网络请求都完成了,dispatch_semaphore_signal(semaphore)为计数+1,然后计数-1返回,程序继续执行。 (这里也就是为什么有个count变量的原因,记录网络回调的次数,回调10次之后再发信号量,使后面程序继续运行)。


#import 

 int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // 创建信号量

        __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);

        // 创建队列

        dispatch_queue_t queue = dispatch_queue_create("testBlock", NULL);

        dispatch_async(queue, ^{

            for (int i = 0; i<10; i++) {

                NSLog(@"i的值是:%d",i);

            }

        // 发送通知

            dispatch_semaphore_signal(sem);

        });

        

        // 信号量等待

        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

        
             
       dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"end");

                    for (int j = 0; j<20; j++) {

                          NSLog(@"j的值是:%d",j);

                    }
            });
        

    }

    return 0;

}

使用RAC中的信号组合

for循环遍历

你可能感兴趣的:(iOS 多个网络请求并发执行的解决方案)