在展現(xiàn)tableView之前胸私,我們可能會(huì)做一些獲取數(shù)據(jù)的操作(如下載圖片等)酿傍。
如果該操作比較耗時(shí)弛秋,都放在主線程中(默認(rèn)是在主線程中)執(zhí)行线召,有可能暫時(shí)阻塞主線程铺韧,使界面出現(xiàn)卡頓現(xiàn)象,影響用戶體驗(yàn)缓淹。
因此哈打,這個(gè)問(wèn)題可以用GCD來(lái)解決塔逃,將耗時(shí)的獲取數(shù)據(jù)的操作放在全局隊(duì)列中異步執(zhí)行,例子如下:
在
- (void)viewDidLoad
中有一個(gè)比較耗時(shí)的方法用來(lái)獲取數(shù)據(jù):
- (void)viewDidLoad { [super viewDidLoad]; // 獲得數(shù)據(jù) [self getData]; }
在
-(void) getData
中使用GCD:
-(void)getData { __block __typeof(self)weakSelf = self; // 使用多線程來(lái)做獲取數(shù)據(jù)的操作 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // 數(shù)據(jù)獲取操作......
// 回到主線程更新UI料仗,重新調(diào)用UITableView的reloadData方法(這一句很重要) dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf.tableView reloadData]; }); }); }
關(guān)于reloadData的說(shuō)明:
reloadData方法被調(diào)用之后湾盗,系統(tǒng)會(huì)重新訪問(wèn)數(shù)據(jù)源,重新給數(shù)據(jù)源和代理發(fā)送所有需要的消息立轧,重新調(diào)用數(shù)據(jù)源和代理所有需要的方法格粪,最主要的是- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {}
方法,重新設(shè)置UITableViewCell氛改。