下面是我的新建的Swift学习交流群,欢迎大家一起来共同学习Swift。
不管是IOS还是Android,就三种常用模式,MVC,MVP,MVVM网上的资料非常之多,对于MVVM大家估计都有所了解,我在这里就简单的以图示的形式给大家展示。
- viewmodel层,就是View和Model层的粘合剂
- View层就是ViewController
- Model层就是用于处理数据的层
这样简单的描述了一下,大家应该是可以明白的。
1.项目的目录结构
2.案例的实现:
2.1 View层的实现
2.1.1 ZGJMView的实现
//
// ZGJMView.swift
// HelloSwfit
//
// Created by lidong on 16/6/5.
// Copyright © 2016年 lidong. All rights reserved.
//
import UIKit
/** * 周公解梦的view层 */
protocol ZGJMView {
/** 显示等待进度框 */
func showProgress()
/** 影藏等待进度框 */
func hideProgress()
/** 获取服务器返回的数据 - parameter items: <#items description#> */
func getZGJM(items:Array<String>)
}
2.1.2 ZGJMDemoMVVM的实现
//
// ZGJMDemoMVVM.swift
// HelloSwfit
//
// Created by lidong on 16/6/5.
// Copyright © 2016年 lidong. All rights reserved.
//
import UIKit
class ZGJMDemoMVVM: UITableViewController,ZGJMView {
var items:Array = [String]()
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.delegate = self
self.tableView.dataSource = self
self.title = "GET请求"
let vm = ZGJMviewmodel(view: self)
vm.getZGJMData()
}
func showProgress() {
MBProgressHUD.showHUDAddedTo(self.view,animated: true)
}
func hideProgress() {
MBProgressHUD.hideHUDForView(self.view,animated: true)
}
func getZGJM(items: Array<String>) {
self.items = items
self.tableView.reloadData()
}
override func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = UITableViewCell()
cell.textLabel?.text = items[indexPath.row]
return cell;
}
override func tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath) {
Util.showToast(self,message: items[indexPath.row])
}
}
2.2Model层代码的实现:
//
// NetWokingModel.swift
// HelloSwfit
//
// Created by lidong on 16/6/5.
// Copyright © 2016年 lidong. All rights reserved.
//
import Foundation
import SwiftyJSON
/** * 定义获取数据的代理 */
protocol ZGJMModelDelegate {
/** 获取数据成功的回调 - parameter error: <#error description#> */
func getDataError(error:String)
/** 获取数据失败的回调 - parameter items: <#items description#> */
func getDataSuccess(items:Array<String>)
}
/// model层用来获取数据
class ZGJMModel:ResponseResultDelegate {
var delegate : ZGJMModelDelegate!
init(delegate : ZGJMModelDelegate){
self.delegate = delegate
}
/** 获取周公解梦的数据 */
func getZGJMData() {
let aFUtil:AFNetWorkingUtil = AFNetWorkingUtil.sharedInstance
aFUtil.delegate = self
let action:String = "/dream/category"
let dic = ["key":"c73b082b0c150b3bcba2cea1b96a8922"]
aFUtil.get(action,params: dic)
}
/** <#Description#> - parameter responSEObj: <#responSEObj description#> */
func responseSuccess(responSEObj: AnyObject?) {
var items:Array = [String]()
let json = JSON(responSEObj!)
Util.log("responseSuccess",message: json["error_code"].intValue)
Util.log("responseSuccess",message: json["reason"].string!)
Util.log("responseSuccess",message: json["result"].array!.count)
let d = json["result"].array!.count
if d > 0 {
let list: Array<JSON> = json["result"].array!
for item in list {
items.append(item["name"].string!)
}
}
delegate.getDataSuccess(items)
}
/** <#Description#> - parameter responSEObj: <#responSEObj description#> */
func responseError(responSEObj: AnyObject?) {
delegate.getDataError("服务器异常!")
}
}
2.3 viewmodel层的实现
//
// NetWorkingviewmodel.swift
// HelloSwfit
//
// Created by lidong on 16/6/5.
// Copyright © 2016年 lidong. All rights reserved.
//
/// 周公解梦viewmodel层
class ZGJMviewmodel: ZGJMModelDelegate {
/// model
var model:ZGJMModel!
/// view
var view:ZGJMView
/** 构造方法 - parameter view: <#view description#> - returns: <#return value description#> */
init(view:ZGJMView){
self.view = view
self.model = ZGJMModel(delegate: self)
}
/** 获取周公解梦的数据 */
func getZGJMData() {
self.view.showProgress()
self.model.getZGJMData()
}
/** 错误信息的回调 - parameter error: <#error description#> */
func getDataError(error: String) {
self.view.hideProgress()
}
/** 返回成功的回调 - parameter items: <#items description#> */
func getDataSuccess(items: Array<String>) {
self.view.hideProgress()
self.view.getZGJM(items)
}
}
2.4AFNetworkingUtil的实现
//
// AFNetWorkingUtil.swift
// HelloSwfit
//
// Created by lidong on 16/5/17.
// Copyright © 2016年 lidong. All rights reserved.
//
import UIKit
/// 对AFNetworking的封装
/** * 网络请求响应结果的回调 */
protocol ResponseResultDelegate {
/** 响应成功的回调 - parameter response: 成功的信息 */
func responseSuccess(responSEObj:AnyObject?)
/** 响应失败的回调 - parameter responseError: 失败的信息 */
func responseError(responSEObj:AnyObject?)
}
class AFNetWorkingUtil {
/// 基础URL
let BASE_URL = "http://v.juhe.cn"
/// AFHTTPSessionManager
let _sessionManager = AFHTTPSessionManager()
/// 定义一个响应结果的传递代理
var delegate: ResponseResultDelegate?
// 单例 全局的的网络工具
class var sharedInstance: AFNetWorkingUtil
{
struct Static {
static var onceToken : dispatch_once_t = 0
static var instance : AFNetWorkingUtil? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = AFNetWorkingUtil()
}
return Static.instance!
}
/** 获取baseUrl - parameter baseUrl: 基础的url - returns: URL */
func getBaseUrl(baseUrl:String) ->String{
return BASE_URL
}
/** post请求 - parameter action: 请求的action - parameter params: 请求参数 - parameter v: <#v description#> */
func post(action:String,params:Dictionary<String,String>){
_sessionManager.POST(getBaseUrl(BASE_URL)+action,parameters: params,success: { (operation:NSURLSessionDataTask?,responSEObj:AnyObject?) in
print(responSEObj)
self.delegate?.responseSuccess(responSEObj)
}) { (operation:NSURLSessionDataTask?,error:NSError) in
print(error)
self.delegate?.responseError(error)
}
}
/** get请求 - parameter action: 请求的action - parameter params: 请求参数 */
func get(action:String,String>){
_sessionManager.GET(getBaseUrl(BASE_URL)+action,responSEObj:AnyObject?) in
print(responSEObj)
self.delegate?.responseSuccess(responSEObj)
}) { (operation:NSURLSessionDataTask?,error:NSError) in
print(error)
self.delegate?.responseError(error)
}
}
}
总结:最后总结一下,通过使用MVVM对代码进行分层之后,模块化更加的清楚,假如要换网络框架,需要修改model层和api层的代码,其他的层的代码都不需要再动,这样各层之间保持单一职责。代码的易读性变得更强了。