在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
}
}
}