iOS多个网络请求执行

1.使用GCD的dispatch_group_t

```

-(void)Btn{

    NSString *str = @"http://www.jianshu.com/p/6930f335adba";

    NSURL *url = [NSURL URLWithString:str];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLSession *session = [NSURLSession sharedSession];


    dispatch_group_t downloadGroup = dispatch_group_create();

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

        dispatch_group_enter(downloadGroup);


        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {


            NSLog(@"%d---%d",i,i);

            dispatch_group_leave(downloadGroup);


        }];


        [task resume];

    }


    dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{

        NSLog(@"end");

    });

}

```

2..使用GCD的信号量dispatch_semaphore_t

```

-(void)Btn{

    NSString *str = @"http://www.jianshu.com/p/6930f335adba";

    NSURL *url = [NSURL URLWithString:str];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLSession *session = [NSURLSession sharedSession];


    dispatch_semaphore_t sem = dispatch_semaphore_create(0);

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


        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {


            NSLog(@"%d---%d",i,i);

            count++;

            if(count==10) {

                dispatch_semaphore_signal(sem);

                count = 0;

            }


        }];


        [task resume];

    }

    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);


    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"end");

    });

}

```

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次之后再发信号量,使后面程序继续运行)。


3.用GCD信号量实现顺序执行,待所有请求完成后再进行相应操作。


```

-(void)Btn{

    NSString *str = @"http://www.jianshu.com/p/6930f335adba";

    NSURL *url = [NSURL URLWithString:str];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    NSURLSession *session = [NSURLSession sharedSession];


    dispatch_semaphore_t sem = dispatch_semaphore_create(0);

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


        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {


            NSLog(@"%d---%d",i,i);

            dispatch_semaphore_signal(sem);

        }];


        [task resume];

        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

    }


    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"end");

    });

}

```

注:1、2、3均为网络请求执行完后再执行相应操作,但1、2的网络请求为无序,3的请网络请求是按顺序执行。3是最耗时的!!!


```

你可能感兴趣的:(iOS多个网络请求执行)