在didSet, willSet更新UI要注意的線程問題
今天在寫代碼的時候,遇到一個問題
項目是這樣子的,首頁一個tableView,我更新了dataSource沦童,也insert了Section了,但界面沒有顯示出來叹话,稍微一滑動偷遗,第一個section的內(nèi)容顯示了出來,但是整個tableView的contentSize的y會變成0驼壶,也就是滑動完之后還會反彈回原來的位置氏豌,沒辦法向下拉
檢查了幾個地方之后,終于把問題定位了出來热凹,原來問題是因為調(diào)用setter方法的時候我是在子線程調(diào)用泵喘,然后willSet跟didSet方法也會在這個線程里被調(diào)用
大概的代碼是這樣子的,數(shù)組因為是值類型般妙,所以在append的時候的時候也會調(diào)用willSet和didSet
var dataSource: [SomeType] {
didSet {
// 更新UI
}
}
我向服務(wù)器請求數(shù)據(jù)之后append數(shù)據(jù)進(jìn)去dataSource里涣旨,然后在didSet方法里面直接插入section
大家都知道,在子線程里是沒辦法刷新UI的股冗,所以就造成這樣的問題,只要重新回主線程刷新UI就可以了
// 正確的方法
var dataSource: [SomeType] {
didSet {
OperationQueue.main().add {
// 更新UI
}
}
}