一個列表頁面
10個請求介面
依據資料展現介面
1. 問題
碰到一個主頁的需求,涉及到
- 自動播放的圖片介面
- 業務欄內容的介面
- 熱點廣告的介面
- 熱賣商品的介面
- 附件商店的介面
- 附近商品的介面
- 推薦商品的介面
- 。。。
前前後後開啟主頁涉及到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 每天進步一點點