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
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容