多个请求统一更新界面

作者: 蝴蝶之梦天使 | 来源:发表于2018-06-27 15:47 被阅读629次
    图片来之网络

    一个列表页面
    10个请求接口
    依据数据展现界面

    1. 问题

    碰到一个主页的需求,涉及到(1)自动播放的图片接口 (2)业务栏内容的接口 (3)热点广告的接口 (4)热卖商品的接口 (5)附件商店的接口 (6)附近商品的接口 (7)推荐商品的接口 (8)。。。
    前前后后打开主页涉及到10几个接口,因为主页使用的是一个tableview来展现,所以会涉及到刷新tableview的问题。如果按一个接口调用后再调用下一个接口的方式,那么存在效率差的问题。

    2. 解决方案

    使用dispatch_group_t的方法将不同接口使用异步进行获取,等到所有的接口返回数据后,再统一更新界面。
    这样可以充分的发挥多线程的优势,提高访问速度和用户的体验。

    3. 代码实现

    @property (nonatomic, strong) dispatch_group_t myGroup;
    
    {
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
        dispatch_group_t group = dispatch_group_create();
    
        self.myGroup = group;
    
        dispatch_group_enter(group);
        dispatch_group_async(group, queue, ^{
            [self fetchWorkStatus];
    
            DLog(@"111");
        });
    
        dispatch_group_enter(group);
        dispatch_group_async(group, queue, ^{
            [self fetchPermission];
    
            DLog(@"222");
        });
    
        dispatch_group_notify(group, queue, ^{
            DLog(@"333");
        });
    
    
        DLog(@"666");
    }
    

    其中的fetchWorkStatus 和 fetchPermission是网络请求的方法。

    - (void)fetchWorkStatus
    {
        [self.mainViewModel queryHome:^(ErrorCode status, NSString *message, NSDictionary *data) {
    
            DLog(@"444");
    
            dispatch_group_leave(self.myGroup);
        }];
    }
    
    - (void)fetchPermission
    {
        [self.mainViewModel fetchUserPermissionWithUid:[HXQUserAccount currentAccount].userInfoModel.uidStr
                                             completed:^(ErrorCode status, NSString *message, NSArray<NSNumber *> *permissionArr) {
    
                                                 DLog(@"555");
    
                                                 dispatch_group_leave(self.myGroup);
                                             }];
    }
    

    重点:在请求返回后调用dispatch_group_leave方法。

    打印日志为:

    666
    222
    111
    444
    555
    333
    

    实现多线程并发请求数据,并在所有请求完成后,再执行一个操作。即在333中执行界面刷新。

    // END 每天进步一点点

    相关文章

      网友评论

      • 洁简:这样会不会等的时间长了点
        蝴蝶之梦天使:一种特殊需求的实现吧。
        用这样的实现方式,可以按不同需求设计。

      本文标题:多个请求统一更新界面

      本文链接:https://www.haomeiwen.com/subject/daobyftx.html