iOS应用架构设计:MVC、MVVM、VIPER对比(零基础也能看懂)

PR审核员
2025-12-14 14:08
阅读 761

大家好,我是一名工作5年的后端开发,但因为经常和iOS团队协作,对移动端架构也研究了不少。今天写这篇教程,是因为我当初学的时候,看到“MVC”“MVVM”这些词就头大,网上教程要么太抽象,要么直接甩代码,根本看不懂。所以我想用最简单的话,带完全零基础的朋友搞明白:iOS应用架构到底是什么?为什么要有不同的架构?它们有什么区别?

本文不依赖任何图片,纯文字+代码+表格,手把手带你入门。


一、什么是“应用架构”?

你可以把“架构”理解成盖房子的图纸

  • 没有架构:你想到哪写到哪,按钮点一下直接改UI,数据请求写在视图里……短期能跑,但功能一多就乱成一锅粥。
  • 有架构:职责分明,谁负责显示、谁负责逻辑、谁负责数据,清清楚楚。后期加功能、改bug、团队协作都轻松。

为什么重要?

  • 产品需求变更是常态,好的架构让你改起来不崩溃
  • 面试必问!面试题如:“MVC有什么缺点?”“MVVM怎么解决它?”
  • 哪怕你主要写 JavaScript 做前端,理解架构思想也能帮你写出更清晰的代码

🕗 环境准备(超简单)

你不需要马上写代码,但建议装好 Xcode(Apple 官方开发工具):

  1. 打开 Mac App Store
  2. 搜索 “Xcode”
  3. 点击“获取”安装(免费,但体积较大,约10GB)
  4. 安装完成后打开,同意协议即可

零基础提示:不用急着写项目,先理解概念更重要!


二、三大架构详解(用买奶茶举例 🧋)

1. MVC(Model-View-Controller)—— 最经典的“老大哥”

角色分工:

  • Model:奶茶配方、价格、库存(数据)
  • View:奶茶店的菜单板、杯子(用户看到的东西)
  • Controller:店员(接收顾客点单,告诉厨房做奶茶,再把奶茶给顾客)

代码示例(Swift):

// Model
struct Tea {
    let name: String
    let price: Double
}

// View(简化版,实际是 Storyboard 或 SwiftUI)
class TeaView {
    func show(tea: Tea) {
        print("您点了 \(tea.name),价格 ¥\(tea.price)")
    }
}

// Controller
class TeaViewController {
    let view = TeaView()
    
    func orderTea() {
        let tea = Tea(name: "珍珠奶茶", price: 15.0)
        view.show(tea: tea) // 控制器直接调用 View
    }
}

优点:简单直观,Xcode 默认模板就是 MVC
缺点:Controller 容易变成“巨无霸”——既要处理网络请求,又要操作 UI,还要校验数据。我见过上千行的 ViewController,改一行怕崩十处!

新手误区:以为 View 只能是界面,其实 View 也可以是 Label、Button 这些组件。


2. MVVM(Model-View-ViewModel)—— 更清爽的“升级版”

为了解决 MVC 的“胖控制器”问题,MVVM 把业务逻辑从 Controller 移到了 ViewModel。

角色分工:

  • Model:还是奶茶配方
  • View:菜单板 + 顾客(主动问 ViewModel 要数据)
  • ViewModel:智能店长(知道怎么做奶茶、算总价,但不碰界面)

关键机制:数据绑定(Data Binding)
View 监听 ViewModel 的变化,自动更新。比如价格变了,界面自动刷新。

代码示例(使用闭包模拟绑定):

// ViewModel
class TeaViewModel {
    var tea: Tea? {
        didSet {
            onTeaUpdated?(tea!)
        }
    }
    
    var onTeaUpdated: ((Tea) -> Void)?
    
    func fetchTea() {
        // 模拟网络请求
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.tea = Tea(name: "芋圆波波茶", price: 18.0)
        }
    }
}

// ViewController(现在很轻!)
class TeaViewController {
    let viewModel = TeaViewModel()
    let view = TeaView()
    
    init() {
        viewModel.onTeaUpdated = { [weak self] tea in
            self?.view.show(tea: tea)
        }
        viewModel.fetchTea()
    }
}

优点

  • Controller 变瘦了,只负责协调
  • ViewModel 易于单元测试(不依赖 UIKit)
  • 逻辑复用方便(比如 iPad 和 iPhone 共用同一个 ViewModel)

注意:纯 Swift 没有自动数据绑定(不像 JavaScript 的 Vue/React),通常需配合 RxSwift 或 Combine,但初学者用闭包模拟即可理解思想。


3. VIPER(View-Interactor-Presenter-Entity-Router)—— “企业级”严谨派

当你做的产品非常复杂(比如金融、医疗类App),需要极致解耦时,就用 VIPER。

角色分工(5个模块):

  • View:只负责显示和用户交互(比如点击按钮)
  • Presenter:View 的“秘书”,告诉 Interactor 去干活
  • Interactor:真正的业务逻辑(查数据库、调 API)
  • Entity:数据模型(和 Model 类似)
  • Router:负责页面跳转(比如从首页跳到订单页)

流程(文字版“流程图”):

用户点击 View → View 通知 Presenter → 
Presenter 让 Interactor 获取数据 → 
Interactor 返回 Entity 给 Presenter → 
Presenter 格式化数据 → 通知 View 更新 → 
若需跳转,Presenter 调用 Router

代码示例(简化版):

// Entity
struct Order {
    let id: String
    let items: [String]
}

// Interactor
class OrderInteractor {
    func fetchOrder(completion: @escaping (Order) -> Void) {
        // 模拟网络
        completion(Order(id: "123", items: ["奶茶", "蛋糕"]))
    }
}

// Presenter
class OrderPresenter {
    weak var view: OrderViewProtocol?
    let interactor = OrderInteractor()
    let router = OrderRouter()
    
    func viewDidLoad() {
        interactor.fetchOrder { [weak self] order in
            let message = "订单 \(order.id) 包含: \(order.items.joined(separator: ","))"
            self?.view?.show(message: message)
        }
    }
    
    func goToDetail() {
        router.navigateToDetail()
    }
}

// View(协议化,便于测试)
protocol OrderViewProtocol: AnyObject {
    func show(message: String)
}

优点:每个模块职责极单一,适合大型团队、长期维护
缺点:文件多、样板代码多,小项目用它像“杀鸡用牛刀”

我的开发心得:除非公司强制要求,否则新手别一上来就用 VIPER。先把 MVC/MVVM 吃透更重要。


三、三大架构对比表

特性 MVC MVVM VIPER
文件数量 少(3个核心) 中(+ViewModel) 多(5+ 文件/页面)
学习曲线 ⭐⭐ ⭐⭐⭐⭐
适合场景 小型 Demo、快速原型 中大型 App、注重测试 超大型产品、严格工程规范
Controller 负担 极轻(叫 View)
测试难度 难(耦合 UI) 易(ViewModel 纯逻辑) 极易(各模块独立)
面试题出现频率

四、新手常见问题解答

Q1:我该选哪个架构?
A:个人项目或学习 → 从 MVC 开始;想进阶 → 学 MVVM;面试被问 VIPER → 知道它是“更细粒度的解耦”就行。

Q2:MVVM 必须用 RxSwift 吗?
A:不是!可以用闭包、代理、甚至 KVO(不推荐)。RxSwift 只是让绑定更优雅,但增加了学习成本。

Q3:JavaScript 的 MVVM 和 iOS 一样吗?
A:思想一致!比如 Vue.js 的 data 就像 ViewModel,模板自动更新就像数据绑定。跨端开发者更容易理解。

Q4:为什么我的 ViewController 还是很大?
A:检查是否把网络请求、数据解析、本地存储全塞进去了。尝试把逻辑移到单独的 Service 或 Manager 类中——这已经是向 MVVM 靠拢了!


五、下一步学习建议

  1. 动手实践:用 Xcode 创建一个“天气查询”App,分别用 MVC 和 MVVM 实现一遍
  2. 阅读源码:GitHub 上搜 “iOS MVVM example”,看别人怎么组织代码
  3. 深入技术
    • Combine(Apple 官方响应式框架)替代 RxSwift
    • 了解 Clean Architecture(比 VIPER 更通用的分层思想)
  4. 面试准备:重点掌握 “MVC 缺陷 → MVVM 如何解决” 这条逻辑链

结语

架构不是银弹,没有“最好”,只有“最合适”。我当初学的时候,花了三个月才真正理解 MVVM 的价值——不是为了炫技,而是为了让代码活得更久

希望这篇教程能帮你少走弯路。记住:先写能跑的代码,再追求优雅的架构。共勉!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝