@Tkas

Связывание данных во view model с контроллером с RxSwift (паттерн MVVM). Корректно ли мое решение?

Я хочу добиться того, чтобы мой collectionView обновлялся после удаления данных из Core Data. Для этого у меня есть модель FoodViewModel с таким наполнением:
class FoodViewModel: FridgeCollectionVIewViewModelType {

    public var oldData = Variable<[FoodBySections]>([])
    public var foodBySections = Variable<[FoodBySections]>([])
    private var foods: [Food]?
  
   //какой-то код
   ....
   //код удаления
       func deleteFood(forIndexPath indexPath: IndexPath) {
        let objectToDeleteName = self.foodBySections.value[indexPath.section][indexPath.row].name!
        
        oldData.value = foodBySections.value
        CoreDataHelper.sharedInstance.deleteFoodFromFridge(foodName: objectToDeleteName)
        foods = CoreDataHelper.sharedInstance.fetchFoods()
        foodBySections.value = FoodBySections.split(foods: foods!)
    }
}

В приведенном выше коде, последняя инициализация foodBySections будет служить в качестве newData для обновления collectionView. Отрывок кода ViewController такой:
class FridgeCollectionViewController: UICollectionViewController, UIGestureRecognizerDelegate {

    @objc func deleteFood(gesture: UILongPressGestureRecognizer!) {
        if gesture.state != .ended {
            return
        }
        
        let point = gesture.location(in: self.collectionView)
        
        if let indexPath = self.collectionView?.indexPathForItem(at: point) {
            self.foodViewModel?.deleteFood(forIndexPath: indexPath)
            
            var newData: [FoodBySections]?
            _ = self.foodViewModel?.foodBySections.asObservable().subscribe {
                newData = $0.element!
            }

            var oldData: [FoodBySections]?
            _ = self.foodViewModel?.oldData.asObservable().subscribe {
                oldData = $0.element!
            }
            
            self.collectionView.animateItemAndSectionChanges(oldData: oldData!, newData: newData!)
        }
    }
}


То есть, я получаю oldData из вью модели и newData (последняя инициализация foodBySections) тоже из вью модели. И посылаю их для обновления коллекции (collectionView.animateItemAndSectionChanges). Вопрос: корректен ли приведенный код? Или же эту задачу можно решить намного лучше (используя реактивщину)?
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 1
@freeg0r
.. some dude ..
Для отслеживания состояния таблицы CoreData и обновления UI есть готовое удобное решение: NSFetchedResultsController, просто удалите из Core Data нужную запись, а таблица обновиться сама.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы