Является ли хорошая практика связывать модель представления с контроллером представления с использованием замыкания в шаблоне MVVM? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть приложение, в котором ячейка удаляется из представления коллекции после длительного нажатия на нее.Удаление происходит в модели представления и выглядит так:

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!)
    //return data to view controller for collection view
    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 }
            //receive data from view model via closure
            self.collectionView.animateItemAndSectionChanges(oldData: oldData, newData: newData)
        })
    }
}

Это хорошая практика?Или RxSwift - хорошая идея?

1 Ответ

0 голосов
/ 08 декабря 2018

Пока вы держите представление отделенным от источника данных и фоновых функций, которые ничего не делают с фактическим представлением, все должно быть в порядке, и это хорошая практика.В вашем случае я не совсем уверен, где вы размещаете свои функции, но я предполагаю, что действие распространяется вплоть до viewModel, а затем в dataSource для удаления элемента.Я создал несколько приложений с использованием MVVM, и это действительно потрясающе, чисто и легко для понимания.Мое последнее приложение использовало реактивный, не совсем RxSwift, но ReactiveSwift, в любом случае они почти одинаковые.Если честно, если у вас есть время и терпение переписать ваше приложение на rx, это определенно хорошая идея, это действительно сэкономило мне много времени на делегирование и наблюдение, но поначалу это немного сложнее понять.

...