多個請求統一更新介面

_阿南_發表於2018-12-05

圖片來之網路

一個列表頁面

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 每天進步一點點

相關文章