版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/51592303
下面是我的新建的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,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层的代码,其他的层的代码都不需要再动,这样各层之间保持单一职责。代码的易读性变得更强了。
代码地址:
运行的效果: