美文网首页
dispatch_async 学习实战

dispatch_async 学习实战

作者: 嗯哎嘶唠咯 | 来源:发表于2017-08-28 11:07 被阅读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(如果觉得哪里不对,欢迎探讨交流,互相学习 😎)。

    相关文章

      网友评论

          本文标题:dispatch_async 学习实战

          本文链接:https://www.haomeiwen.com/subject/rhpwdxtx.html