dispatch_async 学习实战

dispatch_async 学习实战_第1张图片
占位图

扯淡

据说今天是七夕,what ? 不存在的~,撸篇过,爱咋咋地。。。。。。

dispatch_async 学习实战_第2张图片

正文

问题

相信有很多的同学都遇到过这种问题:
使用控件类 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(如果觉得哪里不对,欢迎探讨交流,互相学习 )。

你可能感兴趣的:(dispatch_async 学习实战)