swift3.0 MVVM与MVC区别

本文仅代表个人看法,有意见或者不服,你可以顺着网线来打我!(开玩笑的, 尽情指点我这个小彩笔)
看了个OC版的MVVM的简单Demo, 手痒就写了个Swift的

MVVM这个框架的知识我就不说了, 网上一大堆,但是看起好麻烦。所以我就写了一个二者区别以便更好的理解!(之前看别人写关于MVVM的, 看起来好复杂, 好难, 研究了之后才知道其实并没有那么难)

swift3.0 MVVM与MVC区别_第1张图片
4.png

怎么说呢,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

你可能感兴趣的:(swift3.0 MVVM与MVC区别)