带有RxSwift的MVVM:用于假人的KickStarter

本教程的目的是开始学习RxSwift 。 通过一个简单的示例,您将能够在其中进行更多探索……

就像上一个故事一样,我已经解决了MVVM…

iOS / Swift MVVM:傻瓜Kickstarter

这个故事是关于我们如何开始学习MVVM体系结构的。 由于您会在…中看到许多教程,

medium.com

使用RxSwift继续执行相同的添加购物车功能。 就像电子商务应用程序(如Amazon,Flipkart等)中的购物车一样,用于添加,删除或更新产品数量。

在继续之前, 从这里简要介绍RxSwift

在10分钟内学习和掌握⚔️RxSwift的基础知识

每个程序员都应该听说过Rx。 无论是在上次开发者大会上还是在阅读新文章时发生的…

medium.com

为此,您至少了解RxSwift中的“ 主题”

来吧 !!! 😄

CartProductTableViewCell中 ,添加以下协议以便可以删除“ +”和“-”按钮。

 协议CartProductCellDelegate:class {func updateQuantity(_ cell:CartProductTableViewCell, 
isIncreasing:Bool)func remove(_ cell:CartProductTableViewCell)
}

“ +”和“-”按钮将调用updateQuantity委托,而“删除”按钮将调用“ 删除一个”。

购物车经理

让我们从添加一个名为CartManager的新文件开始。 它将是一个单例类,如下所示。

 类CartManager { 
静态让共享= CartManager()
私人init(){}
}

CartManager类将处理或购物车项目,引入称为CartProduct的购物车模型。

  struct CartProduct { 
var啤酒:啤酒
var数量:整数
}

在上一教程中已经提到了啤酒课。

回到CartManager,添加如下的 cartItems,即BehaviorRelay类型的CartProduct数组(以前在RxSwift中通常是Variable,但现在已废除,建议使用BehaviorRelay ),如下所示。

  private(set)var cartItems = BehaviorRelay (值:[]) 

注意:在MVVM的最佳实践中,我们不允许ViewModel属性从外部进行操作,即提供合适的getter和setter(如下所示)。 因此,上面的cartItems设置为private(set)

  var itemCount:Int { 
返回self.cartItems.value.count
}功能项目(索引为Int)-> CartProduct {
返回self.cartItems.value [index]
}

注意:RxSwift中 ,我们无法直接访问数组,因此我们使用value获取数组的实际属性,如count,item等。

让我们玩购物车cart

点击任一按钮时,以下方法将更新啤酒项目的数量。

  func updateQuantity(啤酒:啤酒,isIncreeasing:布尔=真){ 

保护让索引= self.cartItems.value.index(其中:{
$ 0.beer.id == beer.id
})else {return} var value = self.cartItems.value如果isIncreasing {
//案例数量增加
value [index] .quantity + = 1
}其他{
//案件数量减少
如果value [index] .quantity == 1 {
value.remove(at:index)
}其他{
value [index] .quantity-= 1
}
} self.cartItems.accept(value)
}

第二个参数isIncreeasing在点击“ + ”时为true,在点击“ ”时为false。 逻辑表明,如果isIncreasing为true,则数量将增加1,否则减少1。同样,如果用户减小到值1,则它将自动从购物车中删除。

因此,在更新时它将看起来像…

敲击2次后魔鬼杯更新为3。 在减少…

3. 删除:如果我们要直接删除啤酒项目,那么我们将按照以下方法在特定索引处删除啤酒项目。

  func remove(啤酒:啤酒){ 

保护让索引= self.cartItems.value.index(其中:{
$ 0.beer.id == beer.id
})其他{返回}
var值= self.cartItems.value
value.remove(at:index)
self.cartItems.accept(value)
}

因此,在移除恶魔杯时,它将看起来像……

我想你会喜欢添加更多😛😛😛

您还可以直接在RxSwift中绑定UITableView ,这将用于UITableView委托和数据源设置的代码减少到5-6行。

完整的项目在这里 ……

RxSwift文档参考:
1. https://github.com/ReactiveX/RxSwift/tree/master/Documentation
2. http://cocoadocs.org/docsets/RxSwift/4.0.0/

目前为止就这样了。
继续学习,快乐编码!!!