在MVVM模式中使用闭包,将视图模型与视图控制器绑定是一种好习惯吗?

时间:2018-12-07 19:01:02

标签: ios swift mvvm closures

我有一个应用程序,在该应用程序上长按它可以将其从集合视图中删除。删除发生在视图模型中,看起来像这样:

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 :(得分:1)

只要将视图与对实际视图没有任何作用的dataSource和背景函数分开,就可以了,这是一种好习惯。在您的情况下,我不太确定要在哪里放置函数,但我猜想该操作会一直传播到viewModel,然后传播到dataSource以删除该项目。我已经使用MVVM构建了一些应用程序,它确实很棒,干净而且易于理解。我的最后一个应用程序使用的是反应性的,不完全是RxSwift,而是ReactiveSwift,无论如何,它们几乎是相同的。老实说,如果您有时间和耐心将应用程序重写为rx,那绝对是个好主意,它确实为我节省了很多委派和观察的时间,但一开始要掌握起来有点复杂。