本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含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);
}];
});
比如上面这段代码:
我用到了reasonPickerView
的高度, 但是我在布局的时候不一定能拿到reasonPickerView
的高度, 那么我们应该怎么办呢? 一般的想法是会在layoutSubviews
或者viewWillLayoutSubviews
或者viewDidLayoutSubviews
等方法, 但是这些方法, 除了会出现新的bug之外, 还会有重复调用多次的问题, 但是有一种解决思路就是主线程异步.
因为主线程异步并不会开辟新的线程, 只是把队列任务放到异步执行, 等待主队列中的当前任务都完成, 主线程空闲的时候, 再来执行需要执行的任务, 那么在本例中, 等到执行到画红色方框的代码时, 主线程中之前的布局任务都已经完成了, 这时候是肯定可以拿到reasonPickerView
的高度的, 那么这时候, 再完成upShadowView
的布局就不会出现bug了.
总之, 主线程异步在项目中是个很常见, 也很有用的小技巧, 谁用谁知道😁