iOS一个页面请求几个接口,怎样请求比较好?(高并发)

1. 记载使用ReactiveObjC

- (void)requestData {

RACSignal *signal1 = [RACSignalcreateSignal:^RACDisposable *(id subscriber) {

// 接口请求一

// ...// 发送succe或者fail数据

[subscribersendNext:@"接口数据一"];

return[RACDisposabledisposableWithBlock:^{}];

}];

RACSignal *signal2 = [RACSignalcreateSignal:^RACDisposable *(id subscriber) {

// 接口请求二

// ...// 发送succe或者fail数据

[subscribersendNext:@"接口数据二"];

return[RACDisposabledisposableWithBlock:^{}];

}];

[selfrac_liftSelector:@selector(updateUIWithData1:data2:)withSignals:signal1, signal2, nil];

}

- (void)updateUIWithData1:(id)data1data2:(id)data2{

// 当接口一, 和接口二都有sendNext时, 就会调用此方法

// 更新UI

}

2. GCD信号量 dispatch_semaphore_t 

<1>dispatch_semaphore_tsemaphore = dispatch_semaphore_create(2);

这行代码创建了一个信号量,同时指明了最多有2个资源可以访问该"临界区域"

<2>dispatch_semaphore_signal(semaphore)

这行代码 提高信号量 , 信号量计数 + 1

<3>dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

这行代码 降低信号量 , 信号量计数 - 1

特别注意 当信号为0(零),在执行 dispatch_semaphore_wait 语句时,信号量计数小于0 ,阻塞当前线程.

//三个网络请求使用GCD信号量实现同步,并且不阻塞主线程

- (void)text3 {
    dispatch_queue_t queue = dispatch_queue_create("AAA", NULL);
    dispatch_async(queue, ^{
         NSLog(@"current1:%@",[NSThread currentThread]);
        dispatch_semaphore_t  semaphore = dispatch_semaphore_create(0);
        [ATBaseRequest getRequestWithMethod:@"https://www.apiopen.top/journalismApi" param:nil success:^(id data) {
            dispatch_semaphore_signal(semaphore);
            NSLog(@"1请求成功");
        } failure:^(NSInteger resultId, NSString *errorMsg) {
            dispatch_semaphore_signal(semaphore);
        }];
       
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //等待信号,当信号总量少于0 的时候就会一直等待 ,否则就可以正常的执行,并让信号总量-1
       
        [ATBaseRequest getRequestWithMethod:@"https://www.apiopen.top/satinApi?type=1&page=1" param:nil success:^(id data) {
            dispatch_semaphore_signal(semaphore);
            NSLog(@"2请求成功");
           
        } failure:^(NSInteger resultId, NSString *errorMsg) {
            dispatch_semaphore_signal(semaphore);
        }];
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //等待信号,当信号总量少于0 的时候就会一直等待 ,否则就可以正常的执行,并让信号总量-1
       
        [ATBaseRequest getRequestWithMethod:@"https://www.apiopen.top/satinCommentApi?id=27610708&page=1" param:nil success:^(id data) {
            NSLog(@"3请求成功");
        } failure:^(NSInteger resultId, NSString *errorMsg) {
           
        }];
       
    });
   
}

3.假如现在有一个这样的需求,需要先下载50张图片, 一般异步会开启新的线程,但过多的线程 数与项目的性能是成反比的 . 所以控制并发,提高性能则尤为重要 : 实例代码如下

- (void)testGCD3{
    dispatch_semaphore_t semaphore =  dispatch_semaphore_create(5);//创建计数为5的信号量
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (int i=0;i<100 ; i++) {
       
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        //当i==5时,信号量计数<0了,for循环线程阻塞,不继续执行for循环里面同一线程的代码,等到前面5次异步执行完毕,信号量就会增加,紧接着继续执行for循环从而保证控制最大并发量的效果
        dispatch_async(queue, ^{
            NSLog(@"i = %d",i);
            //此处模拟一个 异步下载图片的操作
            sleep(2);
            dispatch_semaphore_signal(semaphore);
        });
    }
}

你可能感兴趣的:(iOS一个页面请求几个接口,怎样请求比较好?(高并发))