在didSet, willSet更新UI要注意的线程问题
今天在写代码的时候,遇到一个问题
项目是这样子的,首页一个tableView,我更新了dataSource,也insert了Section了,但界面没有显示出来,稍微一滑动,第一个section的内容显示了出来,但是整个tableView的contentSize的y会变成0,也就是滑动完之后还会反弹回原来的位置,没办法向下拉
检查了几个地方之后,终于把问题定位了出来,原来问题是因为调用setter方法的时候我是在子线程调用,然后willSet跟didSet方法也会在这个线程里被调用
大概的代码是这样子的,数组因为是值类型,所以在append的时候的时候也会调用willSet和didSet
var dataSource: [SomeType] {
didSet {
// 更新UI
}
}
我向服务器请求数据之后append数据进去dataSource里,然后在didSet方法里面直接插入section
大家都知道,在子线程里是没办法刷新UI的,所以就造成这样的问题,只要重新回主线程刷新UI就可以了
// 正确的方法
var dataSource: [SomeType] {
didSet {
OperationQueue.main().add {
// 更新UI
}
}
}