iOS 多任务异步请求 信号量

2021-05-31  本文已影响0人  陈先生的干货店

开发过程中我们常碰到一个界面有请求多个接口,可以这样操作:

1.这个适用于各个请求不相关联:

-(void)requestAll_GCDSemaphore{
    //创建信号量
    //下面都是示范接口
  
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, queue, ^{
        //1
        NSDictionary *param = @{@"cate":@"1"};
        [ASNetworkingSerivce postRequestWithApi:@"http://zl.kobi.shop/api/index/yuedu_list" param:param success:^(NSDictionary * _Nonnull rootDict) {
            NSLog(@"1--------\n%@",rootDict);
            dispatch_semaphore_signal(semaphore);
        } failure:^(id  _Nonnull error) {
            NSLog(@"1--------\n%@",@"请求失败");
            dispatch_semaphore_signal(semaphore);
        }];
    });
    
    dispatch_group_async(group, queue, ^{
        //2
        NSDictionary *param = @{@"cate":@"1",@"page":@"2"};
        [ASNetworkingSerivce postRequestWithApi:@"http://zl.kobi.shop/api/index/yuedu_list" param:param success:^(NSDictionary * _Nonnull rootDict) {
            NSLog(@"2--------\n%@",rootDict);
            dispatch_semaphore_signal(semaphore);
        } failure:^(id  _Nonnull error) {
            NSLog(@"2--------\n%@",@"请求失败");
            dispatch_semaphore_signal(semaphore);
        }];

    });
    
    dispatch_group_async(group, queue, ^{
        //3
        NSDictionary *param = @{@"cate":@"1",@"page":@"3"};
        [ASNetworkingSerivce postRequestWithApi:@"http://zl.kobi.shop/api/index/yuedu_list" param:param success:^(NSDictionary * _Nonnull rootDict) {
            NSLog(@"3--------\n%@",rootDict);
            dispatch_semaphore_signal(semaphore);
        } failure:^(id  _Nonnull error) {
            NSLog(@"3--------\n%@",@"请求失败");
        }];
        
    });
    //这里会等待3个接口请求成功或者失败之后 才去通知主线程的刷新
    dispatch_group_notify(group, queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"信号量为0");
        dispatch_async(dispatch_get_main_queue(), ^{
            // 通知主线程刷新
            
        });
    });
}


2.相关联的请求 :

使用场景,比如顶部有多个tab,这个时候我们需要先从后台请求tab,然后再去请求每个tab下面的列表

- (void)requestAppDataSourceSuccess:(void(^)(void))success failure:(void(^)(void))failure {
    __weak typeof(self) weakSelf = self;
   //首先课定义一个block回调,这里面就是等待tab请求完成后再来执行block里面的代码
    void(^loadGoodsList)(void) = ^{
        ASXianYuGroupModel *groupModel = weakSelf.groupList.firstObject;
        NSDictionary *param = @{@"taoBao2GoodsGroupId":groupModel.taoBao2GoodsGroupId,@"pageNum":@"0",@"pageSize":@"20"};
        [ASNetworkingSerivce getRequestWithApi:@"http://test.api.doushangzhitongche.com/dsztc/app/taobao2/goods/list-app" param:param success:^(NSDictionary * _Nonnull rootDict) {
            if ([rootDict objectForKey:@"code"]) {
                NSInteger code = [rootDict[@"code"] integerValue];
                if (code == 200) {
                    weakSelf.sourceList = [ASXianYuListModel mj_objectArrayWithKeyValuesArray:rootDict[@"rows"]];
                    CGFloat cellW = ([UIScreen mainScreen].bounds.size.width - 50.f) / 2;
                    for (ASXianYuListModel *sourceModel in weakSelf.sourceList) {
                        UIImage *image = [[SDImageCache sharedImageCache] imageFromCacheForKey:sourceModel.topPictureUrl];
                        if (image) {
                            sourceModel.imageSize = image.size;
                        }else {
                            sourceModel.imageSize = CGSizeMake(100.f, 200.f);
                        }
                        CGSize lblSize = [sourceModel.title boundingRectWithSize:CGSizeMake(cellW - 20.f, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} context:nil].size;
                        sourceModel.textHeight = lblSize.height;
                    }
                }
            }
            success();
        } failure:^(id  _Nonnull error) {
            failure();
        }];
    };
    
//首先请求tab列表的接口
    [ASNetworkingSerivce getRequestWithApi:tabUrl param:@{} success:^(NSDictionary * _Nonnull rootDict) {
        if ([rootDict objectForKey:@"code"]) {
            NSInteger code = [rootDict[@"code"] integerValue];
            if (code == 200) {
                // 请求tab接口成功之后  再去调用上面blcok
                 loadGoodsList();
            }
        }
       
    } failure:^(id  _Nonnull error) {
        failure();
    }];
}

调用

- (void)viewDidLoad {
    [super viewDidLoad];

    __weak typeof(self) weakSelf = self;
    [self requestAppDataSourceSuccess:^{
        NSLog(@"%@",weakSelf.sourceList);
        [weakSelf.collectionView reloadData];
    } failure:^{
            
    }];
}

上一篇下一篇

猜你喜欢

热点阅读