美文网首页
【设计模式】02 - MVC模式 (Model-View-Con

【设计模式】02 - MVC模式 (Model-View-Con

作者: Lebron_James | 来源:发表于2019-05-06 19:15 被阅读0次

    这篇文章是我阅读raywenderlich.comDesign Patterns by Tutorials的总结,文中的代码是我阅读书本之后根据自己的想法修改的。如果想看原版书籍,请点击链接购买。


    MVC (model-view-controller) 把所有类分成三种类型:模型、视图和控制器。

    MVC在iOS开发中是非常常见的,因为这是Apple重度使用的一种设计模式。

    Model:保存应用数据,通常是Struct和Class类型。在Swift中,我们优先选择Struct,因为Struct是值类型,可以避免不必要的循环引用问题。
    View:在屏幕上显示应用界面,通常继承于UIView
    Controller:控制和协调Model和View,通常继承于UIViewContorller

    Controller可以强引用Model和View,所以可以直接访问Model和View。但是反过来Model和View不能强引用Controller,否则会造成引用循环。

    Model可以通过属性观察者来告诉Controller数据发生变化,例如willSetdidSet;而View可以通过手势或者valueChanged事件等告诉Controller。

    简单Demo

    需求是展示一个用户的名字和年龄:

    1. Model:定义了一个Person,有nameage属性
    2. ViewnameLabelageLabel
    3. ControllerPersonInfoViewController,强引用了两个views,nameLabelageLabel;还强引用了person

    viewDidLoad我们从服务器获取数据,获取到数据之后,我们修改person模型的值;模型被修改后告诉控制器,控制器更新nameLabelageLabel。这就是一个简单的MVC。

    import UIKit
    
    struct Person {
        var name: String
        var age: Int
    }
    
    final class PersonInfoViewController: UIViewController {
    
        @IBOutlet var nameLabel: UILabel!
        @IBOutlet var ageLabel: UILabel!
    
        var person: Person? {
            didSet {
                nameLabel.text = person?.name
                ageLabel.text = person?.age
            }
        }
     
        override func viewDidLoad() {
            super.viewDidLoad()
            fetchPersonInfo()
        }
    
        private func fetchPersonInfo() {
            // 假设name和age是从服务器获取的
            let name = "Lebron"
            let age = 25
            person = Person(name: name, age: age)
        }
    }
    

    总结

    在我们刚刚开始学iOS开发时,一般都是从MVC模式开始的。但是MVC有个问题,如果是比较大型的项目,Controller的代码将会变得非常复杂,不方便维护。所以在实际开发中,大型的项目,我们一般考虑使用其他设计模式,例如MVVM等。

    欢迎加入我管理的Swift开发群:536353151

    下一篇文章:【设计模式】03 - 代理模式

    相关文章

      网友评论

          本文标题:【设计模式】02 - MVC模式 (Model-View-Con

          本文链接:https://www.haomeiwen.com/subject/beodoqtx.html