在iOS中采用MVVM:ViewModel职责?

时间:2016-10-16 14:21:13

标签: ios mvvm model viewmodel encapsulation

我想在我的下一个iOS项目中应用MVVM模式,我已经阅读了一些关于它的帖子和博客。但是他们展示的示例非常简单,没有业务逻辑,只有数据模型实体,ViewModel更新。我不清楚谁负责管理业务逻辑和操作:它应该是ViewModel还是Model

例如,让我们说我的一个功能需要:

  • 向Web服务请求一些数据
  • 解析此类数据并将其映射到我的数据模型实体
  • 对此类实体执行一些检查和操作,并使用结果更新ViewModel
  • 处理触发更多更新和操作的计时器

我应该如何分配这些职责以实施MVVM

2 个答案:

答案 0 :(得分:0)

从MVVM中的数据流中,我们可以看到ViewModel的职责:

Data Flow in MVVM
1. UI calls method from ViewModel (Presenter).
2. ViewModel executes Use Case.
3. Use Case combines data from User and Repositories.
4. Each Repository returns data from a Remote Data (Network), Persistent DB Storage Source or In-memory Data (Remote or Cached).
5. Information flows back to the UI where we display the list of items.

有关MVVM的更多描述可以在这里:https://tech.olx.com/clean-architecture-and-mvvm-on-ios-c9d167d9f5b3

答案 1 :(得分:-2)

假设有一个用于获取评论的Web服务

您可以创建CommentService,负责下载数据,解析和初始化/更新模型。因为我们需要获取注释,所以有一个方法

func getComments(_ completion: () -> [Comment])

CommentService.getComments由ViewModel在其加载方法中调用。

class ViewModel {
  private let commentService: CommentService
  private var comments: [Comment] 
  ...

 func load() {
   commentService.getComments() { [weak self] comments in
      self?.comments = comments 
      //notify somehow the view..for example by using delegate
   }
 }
}

例如,我们想要对评论进行downvote / upvote,因此我们可以实现它

struct CommentService {

  ...

  func upvote(comment: Comment, completion: (Void) -> (Comment)) { 

    if comment.upvoted {
       //throw error
    }
     //update via web service and update Comment's model by the response or just increment the comment.upvotes 
     //call completion with updated comment
  }  
}

struct ViewModel {

  func upvoteComment(at index:Int, completion: (() -> ())?) {
       commentService.upvote(comments[index]) { updatedComment in
          //do some more stuff with viewModel
          completion?() //in the completion is implemented updating of ui
       }
  }
}

完成块可以提供更新ui的方式,而无需任何委托或通知

当timer触发方法时,操作结束可以调用delegate方法来更新视图。另一种选择是使用绑定框架(例如Bond),然后视图可以观察ViewModel属性并且不需要委托。

https://github.com/thefuntasty/MVVMTestProject/tree/master/testMVVM 也许这个项目可以帮助你理解。