didSet, willSet方法的线程问题

在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
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容