【问题标题】:How to create MVP and MVVM architecture in iOS Xcode project如何在 iOS Xcode 项目中创建 MVP 和 MVVM 架构
【发布时间】:2018-06-21 08:14:05
【问题描述】:

我已阅读有关 MVC、MVP 和 MVVM 架构的文章,但我并不清楚如何在我的 iOS 应用程序中创建每种架构。我需要为每个架构制作哪些类/控制器文件。如果我们使用 Storyboard/Xib/Programmatically,它们之间有什么区别?

由于我正在为 iOS 应用程序使用 Xcode 默认 MVC 结构,但我想使用 MVVM 结构创建我的新项目,但我不确定如何创建该结构。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 除了它们是少数几个最常用的 iOS 开发设计模式之外,它们没有太多共同点。他们都有自己的方式来看待隔离操作以提高应用程序的健壮性和可扩展性。所有这些都有优点和缺点,您应该选择哪一个仅取决于您选择的项目类型以及您对每种设计模式的适应程度。
  • 顺便说一句,我没有对你的问题投反对票

标签: ios model-view-controller mvvm mvp


【解决方案1】:

这是对这些设计模式的许多变体的过度简化,但我喜欢这样思考两者之间的差异。

MVC

MVP

MVVM

更多信息您可以查看here

【讨论】:

    【解决方案2】:

    iOS 中的 MVVM 架构可以轻松实现,无需使用第三方依赖项。对于数据绑定,我们可以使用 Closure 和 didSet 的简单组合来避免第三方依赖。

    public final class Observable<Value> {
    
        private var closure: ((Value) -> ())?
    
        public var value: Value {
            didSet { closure?(value) }
        }
    
        public init(_ value: Value) {
            self.value = value
        }
    
        public func observe(_ closure: @escaping (Value) -> Void) {
            self.closure = closure
            closure(value)
        }
    }
    

    来自 ViewController 的数据绑定示例:

    final class ExampleViewController: UIViewController {
    
        private func bind(to viewModel: ViewModel) {
            viewModel.items.observe(on: self) { [weak self] items in
                self?.tableViewController?.items = items
                // self?.tableViewController?.items = viewModel.items.value // This would be Momory leak. You can access viewModel only with self?.viewModel
            }
            // Or in one line:
            viewModel.items.observe(on: self) { [weak self] in self?.tableViewController?.items = $0 }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            bind(to: viewModel)
            viewModel.viewDidLoad()
        }
    }
    
    protocol ViewModelInput {
        func viewDidLoad()
    }
    
    protocol ViewModelOutput {
        var items: Observable<[ItemViewModel]> { get }
    }
    
    protocol ViewModel: ViewModelInput, ViewModelOutput {}
    final class DefaultViewModel: ViewModel {  
      let items: Observable<[ItemViewModel]> = Observable([])
    
      // Implmentation details...
    }
    

    以后可以用 SwiftUI 和 Combine 替换(当您的应用中的最低 iOS 版本为 13 时)

    在这篇文章中,对 MVVM 有更详细的描述 https://tech.olx.com/clean-architecture-and-mvvm-on-ios-c9d167d9f5b3

    【讨论】:

      【解决方案3】:

      在 MVVM 中,视图(实际上是 UIViewController)向视图模型询问信息。

      textLabel.text = viewModel.textToShow
      

      视图模型表示构建 UI 所需的一切。视图向视图模型询问这些值(例如,要显示的字符串)。

      在 MVP 中,Presenter 告诉 View 要做什么。

      view.showText(textToShow)
      

      视图控制器实现了一个将这个请求转换为视图控制器细节的协议:

      func showText(_ text: String) {
          textLabel.text = text
      }
      

      以下是 MVP 示例:https://stackoverflow.com/a/54499119/246895

      【讨论】:

        猜你喜欢
        • 2016-07-02
        • 2014-06-30
        • 1970-01-01
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多