您的位置:首页 > 移动开发 > Swift

Swift学习第十一枪-基于协议的MVVM模式的实现

2016-06-05 23:13 507 查看
下面是我的新建的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层的代码,其他的层的代码都不需要再动,这样各层之间保持单一职责。代码的易读性变得更强了。

代码地址:

运行的效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: