Swift学习第十一枪-基于协议的MVVM模式的实现
2016-06-05 23:13
507 查看
下面是我的新建的Swift学习交流群,欢迎大家一起来共同学习Swift。
不管是IOS还是Android,就三种常用模式,MVC,MVP,MVVM网上的资料非常之多,对于MVVM大家估计都有所了解,我在这里就简单的以图示的形式给大家展示。
ViewModel层,就是View和Model层的粘合剂
View层就是ViewController
Model层就是用于处理数据的层
这样简单的描述了一下,大家应该是可以明白的。
总结:最后总结一下,通过使用MVVM对代码进行分层之后,模块化更加的清楚,假如要换网络框架,需要修改model层和api层的代码,其他的层的代码都不需要再动,这样各层之间保持单一职责。代码的易读性变得更强了。
代码地址:
运行的效果:
不管是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,params:Dictionary<String,String>){ _sessionManager.GET(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) } } }
总结:最后总结一下,通过使用MVVM对代码进行分层之后,模块化更加的清楚,假如要换网络框架,需要修改model层和api层的代码,其他的层的代码都不需要再动,这样各层之间保持单一职责。代码的易读性变得更强了。
代码地址:
运行的效果:
相关文章推荐
- Swift教程 swift基础
- Swift学习一
- swift学习之路(十一)函数
- 【swift学习笔记】五.使用枚举优雅的管理Segue
- 孟加拉央行SWIFT攻击事件恶意木马分析(转)
- Swift语言中的枚举和结构体
- Swift报错 - dyld: Library not loaded: @rpath/MySDK.framework/MySDK 错误解决
- Swift学习第十枪-AFNetwoking3.0的封装
- Swift基础(六):属性、方法、下标脚本
- Swift 中使用 SQLite——新增数据
- Swift 中使用 SQLite——修改和删除数据
- Swift 中使用 SQLite——查询数据
- Swift 中使用 SQLite——批量更新(事务处理)
- Swift 中使用 SQLite——打开数据库
- 记OC迁移至swift中笔记20tips
- Swift专题讲解二十三——高级运算符
- 【swift学习笔记】四.swift使用Alamofire和swiftyJson
- 【swift学习笔记】四.swift使用Alamofire和swiftyJson
- Swift基础(五):类和结构体
- 听说Swift很NB,那么来勉强学点(3.3)--集合类型字典Dictionary