本文仅代表个人看法,有意见或者不服,你可以顺着网线来打我!(开玩笑的, 尽情指点我这个小彩笔)
看了个OC版的MVVM的简单Demo, 手痒就写了个Swift的
MVVM这个框架的知识我就不说了, 网上一大堆,但是看起好麻烦。所以我就写了一个二者区别以便更好的理解!(之前看别人写关于MVVM的, 看起来好复杂, 好难, 研究了之后才知道其实并没有那么难)
怎么说呢,MVVM其实是把ViewController里面的逻辑处理放在ViewModel里面进行处理了
viewModel里面的代码:
import UIKit
import Alamofire
import SwiftyJSON
class MovieViewModel: NSObject {
// 获取数据, 这个本来是放在HomeViewController里面的, 现在放在ViewModel了
func getData(complete:@escaping (_ array: [MovieModel]) -> Void) {
let url = HEAD_URL + "/v2/movie/coming_soon"
Alamofire.request(url, method: .post).responseJSON { (response) in
if let data = response.result.value {
let json = JSON(data)
var array = [MovieModel]()
let subjects = json["subjects"].arrayValue
for subject in subjects {
let model = MovieModel()
model.movieName = subject["title"].stringValue
model.year = subject["year"].stringValue
model.imageUrl = subject["images"]["medium"].stringValue
model.detailUrl = subject["alt"].stringValue
array.append(model)
}
complete(array)
}
else {
print(response.error)
}
}
}
// 这里其实是HomeViewController里面 tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 里面执行的代码, 也是换了位置
func movieDetailWithPublicModel(movieModel: MovieModel, superController: UIViewController) {
let movieVC = MovieViewController()
movieVC.url = movieModel.detailUrl
superController.navigationController?.pushViewController(movieVC, animated: true)
}
}
再看看HomeViewController里面
import UIKit
class HomeViewController: UIViewController {
var array = [MovieModel]()
var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
setUI()
}
func setUI() {
self.title = "电影首页"
tableView = UITableView(frame: CGRect(x: 0, y: 0, width: width, height: height), style: .plain)
tableView.delegate = self
tableView.dataSource = self
tableView.rowHeight = 80
self.view.addSubview(tableView)
tableView.register(UINib(nibName: "MovieCell", bundle: nil), forCellReuseIdentifier: "Cell")
// 调用ViewModel 的 getData 闭包 获取数据! 对应ViewModel的func getData(complete:@escaping (_ array: [MovieModel]) -> Void) 方法
let model = MovieViewModel()
model.getData { [weak self] (dataArray) in
self!.array = dataArray
self!.tableView.reloadData()
}
}
}
extension HomeViewController: UITableViewDataSource,UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.array.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MovieCell
cell.model = array[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let movieModel = MovieViewModel()
movieModel.movieDetailWithPublicModel(movieModel: array[indexPath.row], superController: self)
}
}
看到这样有人会问了,既然只是代码换了位置,那MVVM有什么用?
耦合更低, 代码维护更方便,逻辑代理处理更加容易! 而且还有MVVM+RAC我还没研究,研究了我再告诉你有什么用!
有兴趣的可以下Demo看看:https://github.com/BJGX/MVVM-Demo