主线程异步是个好东西

2018-11-28  本文已影响0人  小冰山口

本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

主线程异步是个好东西

可以帮助我们解决很多问题, 项目中经常会遇到一些奇怪的bug:

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.upShadowView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.left.right.mas_equalTo(self.reasonPickerView);
            make.height.mas_equalTo(self.reasonPickerView.tg_height * 0.1);
        }];

        [self.downShadowView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.bottom.left.right.mas_equalTo(self.reasonPickerView);
            make.height.mas_equalTo(self.reasonPickerView.tg_height * 0.1);
        }];
    });

比如上面这段代码:

image.png

我用到了reasonPickerView的高度, 但是我在布局的时候不一定能拿到reasonPickerView的高度, 那么我们应该怎么办呢? 一般的想法是会在layoutSubviews或者viewWillLayoutSubviews或者viewDidLayoutSubviews等方法, 但是这些方法, 除了会出现新的bug之外, 还会有重复调用多次的问题, 但是有一种解决思路就是主线程异步.

因为主线程异步并不会开辟新的线程, 只是把队列任务放到异步执行, 等待主队列中的当前任务都完成, 主线程空闲的时候, 再来执行需要执行的任务, 那么在本例中, 等到执行到画红色方框的代码时, 主线程中之前的布局任务都已经完成了, 这时候是肯定可以拿到reasonPickerView的高度的, 那么这时候, 再完成upShadowView的布局就不会出现bug了.

总之, 主线程异步在项目中是个很常见, 也很有用的小技巧, 谁用谁知道😁

PS. 本人有若干成套学习视频, 包含Java, 数据结构与算法, iOS, 安卓, python, flutter等等, 如有需要, 联系微信tsaievan.

上一篇下一篇

猜你喜欢

热点阅读