Alamofire封装库Moya
Moya
moya 对Alamofire网络请求库进行了封装,开发不需要写网络模型,管理等。使代码更加简洁。详情访问 Moya 项目主页
1. 创建一个iOS Swift项目 (废话)
这里使用cocoapods 创建Podfile文件放在项目根目录下
Java
source 'https://github.com/CocoaPods/Specs.git' use_frameworks! pod 'Moya'
source 'https://github.com/CocoaPods/Specs.git' use_frameworks! pod 'Moya'
在项目根目录运行
Java
pod install --verbose --no-repo-update // 不更新repo, 速度会快点
podinstall --verbose --no-repo-update // 不更新repo, 速度会快点
安装成功
点击 .xcworkspace
文件。启动项目
2. 创建API管理文件 DSAPI.Swift
这里我们使用逗视的api1.引入Moya头文件
Java
<code class="swift">import Foundation import Moya </code>
<codeclass="swift">import Foundation import Moya </code>
2.创建DS的请求方法列表 enum
Java
/** MARK: 创建DS 请求方法列表 - GetVideosByType 根据类型获取视频列表 */ public enum DS { case GetVideosByType(Int,Int,Int,Int) //根据类型获取视频列表 }
/** MARK: 创建DS 请求方法列表 - GetVideosByType 根据类型获取视频列表 */ public enum DS { case GetVideosByType(Int,Int,Int,Int) //根据类型获取视频列表 }
3.创建 MoyaProvider
Java
// MARK: - Provider setup let DSProvider = MoyaProvider<DS>()
// MARK: - Provider setup letDSProvider = MoyaProvider<DS>()
4.通过Moya 定义的 baseUrl
、 请求路径( path
)、 Http方法、 参数和目标的示例数据的协议。
扩展DS : TargetType
Java
extension DS: TargetType { // 逗视API地址 public var baseURL: NSURL { return NSURL(string: "https://api.doushi.me/v1/rest/video/")! } /// 拼接请求字符串 public var path: String { switch self { case .GetVideosByType(let vid, let count, let type,let userId): return ("getVideosByType//(vid)//(count)//(type)//(userId)") } } /// 请求方法 public var method: Moya.Method { return .GET } /// 配置参数 public var parameters: [String: AnyObject]? { switch self { default: return nil } } /// 数据 public var sampleData: NSData { switch self { case .GetVideosByType: return "Half measures are as bad as nothing at all.".dataUsingEncoding(NSUTF8StringEncoding)! } } }
extensionDS: TargetType { // 逗视API地址 public var baseURL: NSURL { return NSURL(string: "https://api.doushi.me/v1/rest/video/")! } /// 拼接请求字符串 public var path: String { switch self { case .GetVideosByType(letvid, letcount, lettype,letuserId): return ("getVideosByType//(vid)//(count)//(type)//(userId)") } } /// 请求方法 public var method: Moya.Method { return .GET } /// 配置参数 public var parameters: [String: AnyObject]? { switch self { default: return nil } } /// 数据 public var sampleData: NSData { switch self { case .GetVideosByType: return "Half measures are as bad as nothing at all.".dataUsingEncoding(NSUTF8StringEncoding)! } } }
OK 这样创建好了DSAPI管理类,下面在tableView中实验一把
5.创建VideosTableViewController
- 定义数据集合
Java
var repos = NSArray()
var repos = NSArray()
- 创建loadData()方法请求网络数据
Java
/** 请求数据 */ func loadData() { DSProvider.request(DS.GetVideosByType(0, 12, 0, 1)) {(result) -> () in switch result { case let .Success(response): do { let json: Dictionary? = try response.mapJSON() as? Dictionary<String, AnyObject> if let json = json { print(json["content"] as! Array<AnyObject>) if let contents: Array<AnyObject> = json["content"] as? Array<AnyObject> { self.repos = contents } } self.tableView.reloadData() } catch { } case let .Failure(error): print(error) break } } }
/** 请求数据 */ funcloadData() { DSProvider.request(DS.GetVideosByType(0, 12, 0, 1)) {(result) -> () in switch result { case let .Success(response): do { letjson: Dictionary? = try response.mapJSON() as? Dictionary<String, AnyObject> if letjson = json { print(json["content"] as! Array<AnyObject>) if letcontents: Array<AnyObject> = json["content"] as? Array<AnyObject> { self.repos = contents } } self.tableView.reloadData() } catch { } case let .Failure(error): print(error) break } } }
- 扩展VideosTableViewController Cell增添数据
Java
extension VideosTableViewController { override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) // Configure the cell... let contentDic = repos[indexPath.row] as? Dictionary<String, AnyObject> cell.textLabel?.text = contentDic!["title"] as? String return cell } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return repos.count } }
extension VideosTableViewController { overridefunctableView(tableView: UITableView, cellForRowAtIndexPathindexPath: NSIndexPath) -> UITableViewCell { letcell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) // Configure the cell... letcontentDic = repos[indexPath.row] as? Dictionary<String, AnyObject> cell.textLabel?.text = contentDic!["title"] as? String return cell } overridefunctableView(tableView: UITableView, numberOfRowsInSectionsection: Int) -> Int { return repos.count } }
OK,点击 Run
看一下效果吧
正确获取到 逗视 app的视频列表了
有没有发现这样写网络请求很爽,我们只维护 DSAPI
就可以了,添加请求方法,处理数据等。
本文例子已经上传到github,有问题可以发送邮件iosdev#itjh.com.cn