**优点:**
- 低耦合
- 可重用性
- 独立开发
- 可测试: 针对viewmodel测试
//
// ViewController.swift
// GA_MVC
//
// Created by houjianan on 2017/3/15.
// Copyright © 2017年 houjianan. All rights reserved.
//
import UIKit
// Controller
class ViewController: UIViewController {
private lazy var viewModel: ViewModel = ViewModel()
private lazy var myView: MyView = {
let v = MyView(frame: CGRect(x: 100, y: 100, width: 200, height: 40), handler: {
[weak self] in
if let weakSelf = self {
weakSelf.loadData(name: "GA_清风又来")
}
})
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(myView)
loadData(name: "GA_清风自来")
}
private func loadData(name: String) {
viewModel.reloadData(name: name, over: {
[weak self] in
if let weakSelf = self {
weakSelf.myView.model = weakSelf.viewModel.model
}
})
}
}
// View
class MyView: UIView {
// 别名闭包
typealias Handler = () -> ()
var handler: Handler!
// 传入view的模型
var model: Model? {
didSet {
//更新UI
nameLabel.text = model?.name
}
}
// 创建UI对象Label
lazy var nameLabel: UILabel = {
let l = UILabel(frame: self.bounds)
l.textColor = UIColor.white
l.textAlignment = .center
self.addSubview(l)
return l
}()
convenience init(frame: CGRect, handler: @escaping () -> ()) {
self.init(frame: frame)
createUI()
self.handler = handler
}
private func createUI() {
self.backgroundColor = UIColor.orange
self.layer.borderColor = UIColor.brown.cgColor
self.layer.borderWidth = 2.0
}
// view的点击事件,事件传到controller,可用:代理,通知,闭包。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.handler()
}
}
// Model
class Model {
var name: String!
init(name: String) {
self.name = "名字:" + name
}
}
class ViewModel {
var model: Model?
public func reloadData(name: String, over: @escaping () -> ()) {
// 模拟网络请求
let time = DispatchTime.now() + Double(Int64(2 * 1000 * 1000000)) / Double(NSEC_PER_SEC)
DispatchQueue.global().asyncAfter(deadline: time, execute: {
let model = Model(name: name)
DispatchQueue.main.async {
[weak self] in
if let weakSelf = self {
weakSelf.model = model
over()
}
}
})
}
}
MVVM
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 维基原文:维基百科Model–view–viewmodel 中文原文:http://www.jianshu.com...
- MVVM(Model View ViewModel)是一种基于MVC的设计,开发人员在HTML上写一些Bindin...
- 本文来源:《Android源码设计模式》一书 著 何红辉/关爱民 mvvm与mvp非常相似,唯一的区别是view和...
- Google的DataBinding发布已经很长时间了,现在也已经很成熟也比较稳定了。我之前的项目一直使用MVP,...