iOS 使用局部block处理接口依次调用需求

850 阅读1分钟

开发中接口偶尔也会遇到接口数据依赖的问题,比如接口二需要接口一返回的某个回参作为入参才能请求,这时就需要等接口一请求完成在去调用接口二。一般都是使用信号量、GCD等。

遇到这种问题博主一般都是使用信号量。如下发

__block dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
NSDictionary *arguments = @{@"type":@(1)};
[Network JSON_POST:arguments view:self.view prefix:@"" funItem:@"" success:^(NSDictionary * _Nonnull response){    dispatch_group_leave(group);} error:^(NSDictionary * _Nonnull response) {} failure:^{}];
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    
});

或者使用下面的嵌套地狱,优点是很直观的解决了问题,缺点是如果只有两层嵌套还好,当多的时候能让人看的头皮发麻,后期维护麻烦还容易被喷。

//接口一
[Network requestData:^{
   //接口二
   [Network requestData2:^{
   } error:^{
       !error ?: error();
   }];
} error:^{
   !error ?: error();
}];

然后想到了局部的block,block是可以写在方法内的,同时block看着更直白,方便。

- (void)viewDidLoad {
    [super viewDidLoad];
    void (^requestData3)(NSString *value) = ^(NSString *value){
       // 接口3
       [Network request:@{@"data3":value} success::^{
           //三个接口依次请求完成
           success();
       } failure:^{
           failure();
       }];
    };


    void (^requestData2)(NSString *value) = ^(NSString *value){
       // 接口2
       [Network request:@{@"data2":value} success::^{
           // 所有接口请求成功
           requestData3(@"调用data3");
       } failure:^{
           failure();
       }];
    };
    [Network request:@{@"data1":@"a"} success:^{
       // 接口1
      requestData2(@"调用data2");

    } failure:^{
       failure();
    }];
}