Я хочу добиться того, чтобы мой 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). Вопрос: корректен ли приведенный код? Или же эту задачу можно решить намного лучше (используя реактивщину)?