**优点:**
- 低耦合
- 可重用性
- 独立开发
- 可测试: 针对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()
}
}
})
}
}
网友评论