問題: 請說一下tableview的數(shù)據(jù)源同步問題, 都有哪些解決方法
或者問: 多線程對tableview同一共享數(shù)據(jù)源操作 都有哪些解決方法
我們看下一個例子, 方便理解理解這個問題

例子
針對tableview, 要同步進(jìn)行操作, 數(shù)據(jù)變更怎么處理 ?
下面方法我都拿這個場景舉例:
tableview 初始數(shù)據(jù)為[A, B, C], 主線程做個刪除操作, 刪除B。子線程做個請求加載, 加載[D, E, F]。最終目的以返回 [A, C, D, E, F] 刷新UI
方法一: 并發(fā)訪問

方法一例子
- 子線程拷貝一份數(shù)據(jù)1:[A, B, C], 進(jìn)行數(shù)據(jù)請求
- 主線程刪除B, 變?yōu)?[A, C] 刷新UI, 此時子線程還在數(shù)據(jù)請求, 暫未返回應(yīng)答
- 子線程數(shù)據(jù)請求完成, 變成數(shù)據(jù)3 [A, B, C, D, E, F], 返回
- 以數(shù)據(jù)3 [A, B, C, D, E, F] 刷新UI
很明顯是錯誤的
稍微改動一下

并發(fā)訪問解決方法
在刪除操作之后, 我們做一個記錄操作, 而在子線程數(shù)據(jù)返回之后, 我們同步操作, 已達(dá)到數(shù)據(jù)正常返回的目的
缺點(diǎn): 記錄操作會做額外的開銷
方法二: 串行訪問
串行訪問是大家寫業(yè)務(wù)最常用的方法

串行訪問解決方法
由于是串行訪問, 那么肯定有一串行隊(duì)列
- 子線程中進(jìn)行網(wǎng)絡(luò)請求/數(shù)據(jù)解析結(jié)果方法串行隊(duì)列, 進(jìn)行新增數(shù)據(jù)預(yù)排版等操作, 此時主線程刪除操作等待
- 串行隊(duì)列處理完子線程數(shù)據(jù)之后, 同步主線程刪除操作
- 刷新UI
缺點(diǎn): 如果子線程操作耗時情況下, 主線程的操作要一直延時等待
總結(jié):
2種方法實(shí)際都各有利弊, 針對于不同場景使用不同方法