2017-02-22 2 views
1

Я получаю частые обновления источника данных tableview и вам необходимо синхронизировать обновления табличного представления с обновлениями данных. Можете ли вы предложить правильный подход к этому в Swift 3?Как синхронизировать обновления данных с помощью перезапуска таблиц с безопасностью потоков?

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() не ждать обновления ViewModel, потому что он отправляется асинхронной в основном потоке.

+0

когда вы вызываете refreshForUpdates() ?? –

+0

Почему ваша модель знает о контроллере? Это наоборот. – rmaddy

+0

@Tushar Shama: В модели вида после строки // Запросить список TVC для перезагрузки таблицы –

ответ

1

Общий подход, который я принимаю в таких случаях, заключается в том, чтобы обеспечить, чтобы в контроллере представления была статическая копия данных, поэтому в фоновом режиме ничего не меняется.

У вас есть главный экземпляр вашей модели данных. Эта модель данных обрабатывает асинхронные обновления. Что нужно сделать, так это сообщить своим слушателям (например, контроллеру вида), что он был обновлен. Слушатель должен ответить на это обновление, сохранив копию модели данных, а затем обновив ее виды (например, перезагрузив представление таблицы).

Если модель основных данных отправляет другое обновление, пока контроллер представления обновляется, это не проблема, поскольку контроллер представления не будет обрабатывать это следующее обновление до тех пор, пока оно не завершит обновление из предыдущего обновления и копию контроллера вида данных еще не изменилось с новым обновлением.

+0

Я действительно думал о подходе «копировать», но я нашел дополнительную работу для простой задачи синхронизации между VC и его viewmodel. Но теперь я попробую, если у меня не появятся лучшие предложения. Спасибо –

+0

Контроллеру просмотра требуется стабильная копия его данных, чтобы убедиться, что его представления синхронизированы с данными. Если данные могут меняться при обновлении представления, у вас возникают проблемы (например, сбои). На самом деле нет другого выбора, кроме как сделать копию, если основные данные обновляются регулярно и асинхронно. – rmaddy

+0

Я согласен и попробую это сейчас. Я на самом деле думал о другом возможном подходе с использованием очередей - для размещения запросов на обновление модели в последовательную очередь и их выполнения один за другим синхронно с перезагрузкой tableview.Это означало бы только возобновление обновления новой модели модели, когда предыдущие были завершены, включая перезагрузку таблицы в основном потоке. Я знаю, как это сделать с помощью NSOperation или ProcedureKit, которые я использую, но не был точно уверен, как это сделать с API-интерфейсом Dispatch (GDC) непосредственно в Swift 3. Я бы назвал NSOperation/Procedure законченным, когда завершена перезагрузка таблицы , –

Смежные вопросы