2017-02-22 65 views
1

我正在頻繁更新tableview數據源,並需要正確同步tableview更新和數據源更新。你能在Swift 3中提出正確的方法嗎?如何同步數據源更新與tableview重新加載與線程安全?

ListViewModel

/// Main list viewmodel refreshing and filtering API 
private func refreshCards(withIcon icon: CardIcon) { 

    queue.async { 

     Log.debug("refresh cards Started") 

     switch icon { 

     case .all: 

      self.loadOpenCards() 
      self.loadCompletedCards() 

     default: 

      self.filterOpenCards(byIcon: icon) 
      self.filterCompletedCards(byIcon: icon) 
     } 

     // Ask list TVC to reload table 
     self.listTVC?.refreshForUpdates() 

     Log.debug("refresh cards Finished") 
    } 
} 

ListTableViewController

func refreshForUpdates() { 

    DispatchQueue.main.async { 

     self.updateApprovalListBackgroundGraphics() 

     self.tableView.reloadData() 

     Log.debug("refresh cards Reloaded") 
    } 
} 

在此代碼tableView.reloadData(),因爲它被分派異步主線程不等待視圖模型刷新。

+0

你什麼時候調用refreshForUpdates()? –

+0

爲什麼你的模型知道視圖控制器?這是倒退。 – rmaddy

+0

@Tushar Shama:在視圖模型後行//要求列表TVC重新加載表 –

回答

1

我在這種情況下采取的一般方法是確保視圖控制器有一個數據的靜態副本,所以沒有什麼是在後臺更改。

您擁有數據模型的主實例。此數據模型處理異步更新。它需要做的是通知其監聽器(如視圖控制器)它已被更新。偵聽器應通過保存數據模型的副本並刷新其視圖(例如重新加載表視圖)來響應此更新。

如果主數據模型恰好在視圖控制器正在自我更新時發佈另一個更新,那麼這不是一個問題,因爲視圖控制器將無法處理該下一個更新,直到完成從前一個更新和視圖控制器的副本的數據尚未隨新更新而改變。

+0

我實際上也在考慮'複製'方法,但是我發現VC和它的視圖模型之間的簡單同步任務需要額外的工作。但是,如果我沒有得到任何更好的建議,我現在會嘗試。謝謝 –

+0

視圖控制器需要數據的穩定副本以確保其視圖與數據同步。如果在更新視圖時數據可能發生更改,則會出現問題(如崩潰)。如果主數據定期和異步更新,實際上沒有其他選擇。 – rmaddy

+0

我同意,現在就試試。我實際上正在考慮另一種使用隊列的可能方法 - 將模型更新的請求排入串行隊列,並與tableview重新加載同步地一個接一個地執行它們。這意味着只有在完成包括在主線程上重新加載tableview的previouos時纔開始下一次模型更新刷新。我知道如何使用我正在使用的NSOperation或ProcedureKit來做到這一點,但並不確定如何直接在Swift 3中使用Dispatch(GDC)API來執行此操作。我將在完成tableview重新加載時調用NSOperation/Procedure來完成。 –

相關問題