废话不多说直接上代码

  1. //
  2. // MoyaNetWorking.swift
  3. // GreenAir
  4. //
  5. // Created by BruceAlbert on 2017/9/18.
  6. // Copyright © 2017年 Mars. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import Moya
  11. //import Alamofire
  12. import RxSwift
  13. import SwiftyJSON
  14. import ObjectMapper
  15.  
  16. typealias SuccessClosure = (_ result: AnyObject) -> Void
  17. typealias FailClosure = (_ errorMsg: String?) -> Void
  18.  
  19. enum RequestCode: String {
  20. case failError = "0"
  21. case success = "1"
  22. }
  23.  
  24. class MoyaNetWorking: NSObject {
  25. static let sharedInstance = MoyaNetWorking()
  26. private override init(){}
  27.  
  28. let requestProvider = RxMoyaProvider<RequestApi>()
  29.  
  30. func getCurrentAddressWeather<T: Mappable>(target:RequestApi, type:T.Type, successClosure:@escaping SuccessClosure, failClosure: @escaping FailClosure) {
  31. _ = requestProvider.request(target).subscribe{ event -> Void in
  32. switch event {
  33. case .next(let response):
  34. print("\(response.data)")
  35. let json = JSON.init(data: response.data, options: .allowFragments, error: nil)
  36. let info = Mapper<WeatherModel>().map(JSONObject: json.dictionaryObject)
  37. guard let data = info?.result else {
  38. failClosure("数据为空")
  39. return
  40. }
  41. successClosure(data)
  42. case .error(let error):
  43. print("网络请求失败...\(error)")
  44. default: break
  45. }
  46.  
  47. }
  48. }
  49.  
  50. }
  51.  
  52. public enum RequestApi {
  53. case weather(city:String, province: String)
  54. }
  55.  
  56. extension RequestApi: TargetType {
  57. /// The parameters to be encoded in the request.
  58. public var baseURL: URL {
  59. return NSURL(string: "http://apicloud.mob.com/")! as URL //天气接口BaseUrl
  60. }
  61.  
  62. public var path: String {
  63. switch self {
  64. case .weather(_, _):
  65. return "v1/weather/query"
  66. }
  67. }
  68.  
  69. public var method: Moya.Method {
  70. switch self {
  71. case .weather(_, _):
  72. return .get
  73. default :
  74. return .post
  75. }
  76. }
  77.  
  78. public var parameters: [String : Any]? {
  79. switch self {
  80. case let .weather(city, province):
  81. return ["key":"202a3152f2222", "city":city, "province":province]
  82. default:
  83. return nil
  84. }
  85. }
  86.  
  87. public var parameterEncoding : ParameterEncoding {
  88. return URLEncoding.default
  89. }
  90. // 单元测试用
  91. public var sampleData: Data {
  92. return "{}".data(using: String.Encoding.utf8)!
  93. }
  94.  
  95. public var task: Task {
  96. return .request
  97. }
  98.  
  99. public var validate: Bool{
  100. return true
  101. }
  102.  
  103. }

swift 请求成功和失败 block

  1. typealias SuccessClosure = (_ result: AnyObject) -> Void
  2. typealias FailClosure = (_ errorMsg: String?) -> Void

请求状态码

  1. enum RequestCode: String {
  2. case failError = "0"
  3. case success = "1"
  4. }

实例和遵守协议

  1. static let sharedInstance = MoyaNetWorking()
  2. let requestProvider = RxMoyaProvider<RequestApi>()

请求数据方法+数据监听(Rxswift)

  1. func getCurrentAddressWeather<T: Mappable>(target:RequestApi, type:T.Type, successClosure:@escaping SuccessClosure, failClosure: @escaping FailClosure) {
  2. _ = requestProvider.request(target).subscribe{ event -> Void in //Rxswift的元素监听
  3. switch event {
  4. case .next(let response):
  5. print("\(response.data)")
  6. let json = JSON.init(data: response.data, options: .allowFragments, error: nil)
  7. let info = Mapper<WeatherModel>().map(JSONObject: json.dictionaryObject)
  8. guard let data = info?.result else {
  9. failClosure("数据为空")
  10. return
  11. }
  12. successClosure(data)
  13. case .error(let error):
  14. print("网络请求失败...\(error)")
  15. default: break
  16. }
  17.  
  18. }
  19. }

请求api,以枚举方式设置接口,使用swift开发过一段的都知道

  1. public enum RequestApi {
  2. case weather(city:String, province: String)
  3. }

设置api扩展且,遵守TargetType协议,TargetType的所有成员必须实现

  1. extension RequestApi: TargetType {
  2. /// The parameters to be encoded in the request.
  3. public var baseURL: URL {
  4. return NSURL(string: "http://apicloud.mob.com/")! as URL //天气接口BaseUrl
  5. }
  6.  
  7. public var path: String {
  8. switch self {
  9. case .weather(_, _):
  10. return "v1/weather/query"//按照api的path,
  11. }
  12. }
  13.  
  14. public var method: Moya.Method {
  15. switch self {
  16. case .weather(_, _):
  17. return .get
  18. default :
  19. return .post
  20. }
  21. }
  22.  
  23. public var parameters: [String : Any]? {
  24. switch self {
  25. case let .weather(city, province):
  26. return ["key":"202a3152f2222", "city":city, "province":province]
  27. default:
  28. return nil
  29. }
  30. }
  31.  
  32. public var parameterEncoding : ParameterEncoding {
  33. return URLEncoding.default
  34. }
  35. // 单元测试用
  36. public var sampleData: Data {
  37. return "{}".data(using: String.Encoding.utf8)!
  38. }
  39.  
  40. public var task: Task {
  41. return .request
  42. }
  43.  
  44. public var validate: Bool{
  45. return true
  46. }
  47.  
  48. }

WeatherModel类及其相关类

  1. //
  2. // WeatherModel.swift
  3. // GreenAir
  4. //
  5. // Created by BruceAlbert on 2017/9/18.
  6. // Copyright © 2017年 Mars. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import ObjectMapper
  11. class WeatherModel : Mappable {
  12. var msg : String?
  13. var retCode : String?
  14. var result : AnyObject?
  15. required init?(map: Map) {
  16. }
  17.  
  18. func mapping(map: Map) {
  19. msg <- map["msg"]
  20. retCode <- map["retCode"]
  21. result <- map["result"]
  22. }
  23. }
  24.  
  25. class WeatherUintModel : Mappable{
  26. var airCondition : String?
  27. var city : String?
  28. var coldIndex : String?
  29. var updateTime : String?
  30. var date : String?
  31. var distrct : String?
  32. var dressingIndex : String?
  33. var exerciseIndex : String?
  34. var humidity : String?
  35. var pollutionIndex : String?
  36. var province : String?
  37. var sunrise : String?
  38. var sunset : String?
  39. var temperature : String?
  40. var time : String?
  41. var washIndex : String?
  42. var weather : String?
  43. var week : String?
  44. var wind : String?
  45. var future : Array<WeatherData>?
  46. required init?(map: Map) {
  47. }
  48.  
  49. func mapping(map: Map) {
  50. airCondition <- map["airCondition"]
  51. city <- map["city"]
  52. coldIndex <- map["coldIndex"]
  53. updateTime <- map["updateTime"]
  54. date <- map["date"]
  55. distrct <- map["distrct"]
  56. dressingIndex <- map["dressingIndex"]
  57. exerciseIndex <- map["exerciseIndex"]
  58. humidity <- map["humidity"]
  59. pollutionIndex <- map["pollutionIndex"]
  60. province <- map["province"]
  61. sunrise <- map["sunrise"]
  62. sunset <- map["sunset"]
  63. temperature <- map["temperature"]
  64. time <- map["time"]
  65. washIndex <- map["washIndex"]
  66. weather <- map["weather"]
  67. week <- map["week"]
  68. wind <- map["wind"]
  69. future <- map["future"]
  70. }
  71. }
  72.  
  73. class WeatherData : Mappable {
  74. var date : String?
  75. var dayTime : String?
  76. var night : String?
  77. var temperature : String?
  78. var week : String?
  79. var wind : String?
  80. required init?(map: Map) {
  81. }
  82.  
  83. func mapping(map: Map) {
  84. date <- map["date"]
  85. dayTime <- map["dayTime"]
  86. night <- map["night"]
  87. temperature <- map["temperature"]
  88. week <- map["week"]
  89. wind <- map["wind"]
  90. }
  91. }

Moya/RxSwift/ObjectMapper/Alamofire开发的更多相关文章

  1. Swift高仿iOS网易云音乐Moya+RxSwift+Kingfisher+MVC+MVVM

    效果 列文章目录 因为目录比较多,每次更新这里比较麻烦,所以推荐点击到主页,然后查看iOS Swift云音乐专栏. 目简介 这是一个使用Swift(还有OC版本)语言,从0开发一个iOS平台,接近企业 ...

  2. 基于Moya、RxSwift和ObjectMapper优雅实现REST API请求

    在Android开发中有非常强大的 Retrofit 请求,结合RxJava可以非常方便实现 RESTful API 网络请求.在 iOS开发中也有非常强大的网络请求库 Moya ,Moya是一个基于 ...

  3. RxSwift + Moya + ObjectMapper

    https://www.jianshu.com/p/173915b943af use_frameworks! target 'RXDemo' do pod 'RxSwift' pod 'RxCocoa ...

  4. Moya 与 RxSwift 使用

    如在OC中使用AFNetworking一般,Swift我们用Alamofire来做网络库.而Moya在Alamofire的基础上又封装了一层: 1.关于moya moya 官方说moya有以下特性-_ ...

  5. ReactiveX 学习笔记(17)使用 RxSwift + Alamofire 调用 REST API

    JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...

  6. iOS:iOS开发非常全的三方库、插件等等

    iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...

  7. iOS开发之资料收集

    github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自github:https://github ...

  8. iOS开发 非常全的三方库、插件、大牛博客等等

    UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableVie ...

  9. iOS 第三方库、插件、知名博客总结

    iOS 第三方库.插件.知名博客总结 用到的组件 1.通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FMDB 本地数据库组件 SDWebImage 多个缩略图 ...

随机推荐

  1. java课堂实践(5月17日)20155317 王新玮

    对P145 MathTool.java 代码托管 在IDEA中,使用JUnit进行单元测试,测试用例不少于三个,要包含正常情况,边界情况.提交测试代码和运行结果截图,加上学号水印,提交码云代码链接. ...

  2. 20155336 《Java程序设计》实验二 (Java面向对象程序设计)实验报告

    20155336 <Java程序设计>实验二 (Java面向对象程序设计)实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...

  3. js获取上月的最后一天

    一.问题: 在最近的开发中遇到一个需求,需要初始化默认时间为上月的最后一天 而在日历中这个值在每个月都不是固定的 二.分析: 问题可以转化为,获取指定月份时间的月末最后一天,下边是代码,供大家参考 f ...

  4. codevs 5429 多重背包

    5429 多重背包 http://codevs.cn/problem/5429 分析: f[i]=g[j-k*siz[i]]+k*val[i]; 发现一个状态d只会更新,d+siz[i],d+2*si ...

  5. 自己用C语言写RL78 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 之前用C实现过多款PI ...

  6. 探寻ASP.NET MVC鲜为人知的奥秘(1):对LESS的支持

    在ASP.NET MVC3中(从那时开始),我们拥有了对js和css等文件的捆绑(Bundling)和压缩(Minification)的能力,这是ASP.NET性能优化工作的一部分. 想一下很久以前, ...

  7. C# VS,连接到oracle 报要升级到8.多少版本的错

    1:确定服务器的oracle版本 2:本地的客户端版本要和服务器一致 3:操作系统位数要一致

  8. javaweb(八)——HttpServletResponse对象(二)

    一.HttpServletResponse常见应用——生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类, 生成随机图片范例: 1 package gacl ...

  9. com.genuitec.runtime.generic.jee60 is not defined 导入项目的异常

    系统加载工程后,报错Target runtime com.genuitec.runtime.generic.jee60 is not defined,在发布工程的同事电脑上正常 新导入的工程,出问题很 ...

  10. ESP8266 NON-OS SDK 和 RTOS SDK实现GPIO中断不同点

    ESP8266 Non-OS SDK 和 RTOS SDK 实现GPIO的方法稍有不同: 对于 Non-OS SDK,比如需要把 MTDO 配置成输入,同时下降沿触发中断: gpio_init(voi ...