理解iOS中的MVVM体系结构

理解iOS中的MVVM体系结构,ios,iphone,design-patterns,mvvm,architecture,Ios,Iphone,Design Patterns,Mvvm,Architecture,为了理解ios的MVVM体系结构,我有几个问题,如下所示- 模型与视图模型有何不同?模型也有数据,为什么我们需要在视图模型中编写和更新相同的属性(重复代码) 在视图和视图模型之间创建双向数据绑定可以很好地进行表单验证。除了它还有其他的应用吗 我们应该使用KVO在视图和视图模型之间创建2个绑定吗?到目前为止有人经历过什么不利因素吗 我们应该将网络(API数据获取)代码放在视图模型中吗 视图模型准备并调整模型中的数据以用于特定位置的视图 有人这样做,但您可能不应该将您的网络放在视图模型中。特别是因为

为了理解ios的MVVM体系结构,我有几个问题,如下所示-

  • 模型与视图模型有何不同?模型也有数据,为什么我们需要在视图模型中编写和更新相同的属性(重复代码)
  • 在视图和视图模型之间创建双向数据绑定可以很好地进行表单验证。除了它还有其他的应用吗
  • 我们应该使用KVO在视图和视图模型之间创建2个绑定吗?到目前为止有人经历过什么不利因素吗
  • 我们应该将网络(API数据获取)代码放在视图模型中吗
  • 视图模型准备并调整模型中的数据以用于特定位置的视图
  • 有人这样做,但您可能不应该将您的网络放在视图模型中。特别是因为同一个模型可以有多个视图模型,这看起来有点奇怪
  • 视图模型准备并调整模型中的数据以用于特定位置的视图
  • 有人这样做,但您可能不应该将您的网络放在视图模型中。特别是因为同一个模型可以有多个视图模型,这看起来有点奇怪

  • 我假设twitter是一个使能工具,尽我所知回答您的问题,希望它能有所帮助

    1) 是的,ViewModel和Model是不同的

    Model - Represents the Domain Objects (Eg: “User” object which may contain id : Int, name : String, avartarURL : String, company : String, location : String, followers : [User], following: [User], etc… )
    
    ViewModel - only represents objects that are represented in view (Eg: nameLabelText : String, profileImageURL : String ) assuming that UserDetailView only shows User name and avatar image. 
    
    2) 在所有情况下,当您希望在UI中显示快速流时, 例如:如果您试图跟踪或取消跟踪一个用户,如果您在UI中查看,当您按下“跟踪”或“取消跟踪”按钮时,该按钮会快速变为相反的状态(跟踪->取消跟踪或取消跟踪->跟踪),即使API请求尚未完成。因为这是为了更好的用户体验,而且这些API不太可能失败

      View -> ViewModel -> API service 
    
    如果200行

     Model Gets Updated 
     ViewModel -> Model
    
    如果Api失败

     ViewModel gets updated and Error message is triggered 
     ViewModel -> View 
    
    3) 从未使用过KVO,但强烈建议您研究/考虑RXCocoa和RXSwift。如果你还没有


    4) 如果应用程序很小并且没有很多域逻辑,那么在Viewmodel中处理API并不是一个坏主意。但如果该领域的逻辑是很多,并有机会增长。我想说的是,包括一个业务逻辑层和一个API服务,这样你就不会在ViewModel中出现方法爆炸,层将是分开的

    我假设twitter是一个使能工具,尽我所知回答你的问题,希望它能有所帮助

    1) 是的,ViewModel和Model是不同的

    Model - Represents the Domain Objects (Eg: “User” object which may contain id : Int, name : String, avartarURL : String, company : String, location : String, followers : [User], following: [User], etc… )
    
    ViewModel - only represents objects that are represented in view (Eg: nameLabelText : String, profileImageURL : String ) assuming that UserDetailView only shows User name and avatar image. 
    
    2) 在所有情况下,当您希望在UI中显示快速流时, 例如:如果您试图跟踪或取消跟踪一个用户,如果您在UI中查看,当您按下“跟踪”或“取消跟踪”按钮时,该按钮会快速变为相反的状态(跟踪->取消跟踪或取消跟踪->跟踪),即使API请求尚未完成。因为这是为了更好的用户体验,而且这些API不太可能失败

      View -> ViewModel -> API service 
    
    如果200行

     Model Gets Updated 
     ViewModel -> Model
    
    如果Api失败

     ViewModel gets updated and Error message is triggered 
     ViewModel -> View 
    
    3) 从未使用过KVO,但强烈建议您研究/考虑RXCocoa和RXSwift。如果你还没有

    4) 如果应用程序很小并且没有很多域逻辑,那么在Viewmodel中处理API并不是一个坏主意。但如果该领域的逻辑是很多,并有机会增长。我想说的是,包括一个业务逻辑层和一个API服务,这样您就不会在ViewModel中出现方法爆炸,层将是分开的

    我的两分钱

  • 模型与视图模型有何不同?模型也有数据,为什么我们需要在中写入和更新相同的属性 查看模型(重复代码)
  • 模型是域的表示数据

    视图模型是具有模型的基本数据并准备好向用户显示的对象

    一个简单的例子:

    如果你有一本书的出版日期,在你的模型上你可能有一个时间戳,而在你的视图模型中你将有逻辑来应用日期格式(用户的首选样式,UTC,DST等)

    我的两美分

  • 模型与视图模型有何不同?模型也有数据,为什么我们需要在中写入和更新相同的属性 查看模型(重复代码)
  • 模型是域的表示数据

    视图模型是具有模型的基本数据并准备好向用户显示的对象

    一个简单的例子:


    如果您有一本书的出版日期,您的模型上可能有一个时间戳,而在视图模型中,您可以应用日期格式(用户首选样式、UTC、DST等)

    谢谢您的回复。事实上,我被迫不使用第三方库,这就是为什么我不能在我的项目中使用RXCocoa和RXSwift的原因。谢谢你的回复。实际上,我被迫不使用第三方库,这就是为什么我不能在我的项目中使用RxCoCoCoA和RXSwift。