在展现tableView之前,我们可能会做一些获取数据的操作(如下载图片等)。
如果该操作比较耗时,都放在主线程中(默认是在主线程中)执行,有可能暂时阻塞主线程,使界面出现卡顿现象,影响用户体验。
因此,这个问题可以用GCD来解决,将耗时的获取数据的操作放在全局队列中异步执行,例子如下:
在
- (void)viewDidLoad
中有一个比较耗时的方法用来获取数据:
- (void)viewDidLoad { [super viewDidLoad]; // 获得数据 [self getData]; }
在
-(void) getData
中使用GCD:
-(void)getData { __block __typeof(self)weakSelf = self; // 使用多线程来做获取数据的操作 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // 数据获取操作......
// 回到主线程更新UI,重新调用UITableView的reloadData方法(这一句很重要) dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf.tableView reloadData]; }); }); }
关于reloadData的说明:
reloadData方法被调用之后,系统会重新访问数据源,重新给数据源和代理发送所有需要的消息,重新调用数据源和代理所有需要的方法,最主要的是- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {}
方法,重新设置UITableViewCell。