@Tkas

Связывание view model с view controller используя замыкания. Корректен ли данный подход в MVVM?

В моем приложении ячейка удаляется с collectionView после долгого нажатия на нее во вью контроллере. Код удаления написан во вью модели и выглядит вот так:
func deleteFood(forIndexPath indexPath: IndexPath, completion: @escaping ([FoodBySections], [FoodBySections]) -> ()) {
        let objectToDeleteName = self.foodBySections[indexPath.section][indexPath.row].name!
        
        let oldData = foodBySections
        CoreDataHelper.sharedInstance.deleteFoodFromFridge(foodName: objectToDeleteName)
        foods = CoreDataHelper.sharedInstance.fetchFoods()
        //newData
        foodBySections = FoodBySections.split(foods: foods!)
        
        completion(oldData, foodBySections)
    }

Код контроллера выглядит так:
@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, completion: { [weak self] (oldData, newData) in
                guard let self = self else { return }
                self.collectionView.animateItemAndSectionChanges(oldData: oldData, newData: newData)
            })
        }
    }

Таким образом, мы получили необходимые данные для обновления collectionView через замыкания. Является ли данный подход в MVVM корректным? Или в любом случае всегда нужно использовать реактивщину?
  • Вопрос задан
  • 373 просмотра
Решения вопроса 1
maestrro712
@maestrro712
 iOS Developer
У меня был опыт использования MVVM без реактивщины. Немного длиннее код, но в целом нормально. Большая часть реактивщины избыточна, если вам нужен только байндинг.

Что касается конкретно этого кода, то все таки в парадигме MVVM не надо связывать действие пользователя с результатом. То есть у вас есть отдельно метод deleteFood(IndexPath) и отдельно
var animatableChanges: ((OldData, NewData) -> Void)?
куда View может засунуть свой байндинг. Такой подход позволяет ViewModel обновлять вьюху тогда, когда она посчитает нужным, а с другой стороны держать код всех байндингов в одном месте (к примеру, в специальном методе, вызываемом из viewDidLoad).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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