dispatch_async 学习实战
2017-08-28 本文已影响17人
嗯哎嘶唠咯
占位图
扯淡
据说今天是七夕,what ? 不存在的~,撸篇简书过,爱咋咋地。。。。。。
正文
问题
相信有很多的同学都遇到过这种问题:
使用控件类 UITableView /UICollectionView 的时候, reloadData
之后要根据刷新之后的Cell/Item进行下一步的UI操作,
but,
而那些数据源方法却是异步执行的,而我们需要那些数据源方法都走完之后,才能有效的进行下一步的UI操作。(大神看到这里,基本可以点✘了 :P),
所以,
如何在刷新完成之后,在执行下一步的操作呢?
解决方法
这里就用到了标题:dispatch_async。
只需要要将后续的操作(任务)放在当前队列(需要是串行队列)的 dispatch_async函数中,就可以做到 数据源方法走完之后 在走接下来的任务:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cellID"];
[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
//刷新过程结束之后,做其他的操作任务处理,比如:
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];
});
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 10;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID"];
cell.textLabel.text = [NSString stringWithFormat:@"%@",@(indexPath.row)];
cell.selectedBackgroundView.backgroundColor = [UIColor redColor];
return cell;
}
举个🌰:
在主线程中
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"11111111111 currentThread = %@",[NSThread currentThread]);
});
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2222222222 currentThread = %@",[NSThread currentThread]);
});
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"3333333333 currentThread = %@",[NSThread currentThread]);
});
输出结果永远是:
控制器输出结论
可见,在串行队列中,异步任务会根据在队列中添加的先后顺序依次执行。所以我大胆(有点心虚=.=)的认为,关于上面提出解决方法,也是这个道理吧 :P(如果觉得哪里不对,欢迎探讨交流,互相学习 😎)。