iOS处理多个网络请求的先后(依赖)关系

在iOS开发中我们经常会遇到多网络请求的问题,有时候需要在一个网络请求结束之后再去请求另一个网络,其实最简单也是最low的方法就是在一个网络请求成功的回调中再去请求另外一个接口信息

使用信号量计数器来实现的代码如下:

static NSString *userSign;
static NSString *userId;

dispatch_group_t group = dispatch_group_create();
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);

dispatch_group_async(group, queue, ^{
    [[BFLoginService shareInstance] getImSignWith: @"gjs598"  complete:^(id  _Nonnull data, RequestError * _Nonnull error) {
        // 任务1
        NSLog(@"获取im签名完成%@", data[@"UserSig"]);
        userSign = data[@"UserSig"];
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
});

dispatch_group_async(group, queue, ^{
    [[BFLoginService shareInstance] getImUserId:^(id  _Nonnull data, RequestError * _Nonnull error) {
        // 任务2
        NSLog(@"获取用户Id完成%@", data[@"userId"]);
        userId = data[@"userId"];
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
});

dispatch_group_notify(group, queue, ^{
    NSLog(@"啊啊啊啊啊啊%@ ----- %@", userId, userSign);
    // 任务1/任务2都完成了, 现在执行任务3
    [[V2TIMManager sharedInstance] login: userId userSig: userSign succ:^{
        // NSLog(@"id登陆成功");
        
        // @weakify(self)
         [[V2TIMManager sharedInstance] getConversationList: INT_MAX count: INT_MAX succ: ^(NSArray *list, uint64_t lastTS, BOOL isFinished) {
             // @strongify(self)
             // [self updateConversation: list];
             NSLog(@"会话列表%@", list);
         } fail:^(int code, NSString *msg) {
             NSLog(@"拉取会话列表失败");
         }];
        
    } fail:^(int code, NSString *desc) {
        NSLog(@"id登陆失败了----------");
        NSLog(@"%@", desc);
    }];
});

你可能感兴趣的:(iOS处理多个网络请求的先后(依赖)关系)