SwiftMoyaNetWorkManager.swift 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. //
  2. // SwiftMoyaNetWorkManager.swift
  3. // RainbowPlanet
  4. //
  5. // Created by 南鑫林 on 2018/8/7.
  6. // Copyright © 2018年 南鑫林. All rights reserved.
  7. //
  8. import Foundation
  9. import Alamofire
  10. import Moya
  11. import SwiftyJSON
  12. import ObjectMapper
  13. import RxSwift
  14. import RxCocoa
  15. import Result
  16. /// 超时时长
  17. private var requestTimeOut:Double = 20
  18. ///网络请求的基本设置,这里可以拿到是具体的哪个网络请求,可以在这里做一些设置
  19. private let myEndpointClosure = { (target: MultiTarget) -> Endpoint in
  20. ///这里把endpoint重新构造一遍主要为了解决网络请求地址里面含有? 时无法解析的bug https://github.com/Moya/Moya/issues/1198
  21. let url = target.baseURL.absoluteString + target.path
  22. var task = target.task
  23. /*
  24. 👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆
  25. 如果需要在每个请求中都添加类似token参数的参数请取消注释上面代码
  26. */
  27. var endpoint = Endpoint(
  28. url: url,
  29. sampleResponseClosure: { .networkResponse(200, target.sampleData) },
  30. method: target.method,
  31. task: task,
  32. httpHeaderFields: target.headers
  33. )
  34. requestTimeOut = 10//每次请求都会调用endpointClosure 到这里设置超时时长 也可单独每个接口设置
  35. return endpoint
  36. }
  37. ///网络请求的设置
  38. private let requestClosure = { (endpoint: Endpoint, done: MoyaProvider.RequestResultClosure) in
  39. do {
  40. var request = try endpoint.urlRequest()
  41. //设置请求时长
  42. request.timeoutInterval = requestTimeOut
  43. // 打印请求参数
  44. if let requestData = request.httpBody {
  45. let parameter = "\(String(data: request.httpBody!, encoding: String.Encoding.utf8) ?? "")"
  46. NXLLog("\n"+"请求地址:"+"\(request.url!)"+"\n"+"请求方式:"+"\(request.httpMethod ?? "")"+"\n"+"请求头部:"+"\(String(describing: request.allHTTPHeaderFields!))"+"\n"+"发送参数:" + String(describing: parameter.removingPercentEncoding!))
  47. }else{
  48. let urlStr = "\(request.url!)"
  49. NXLLog("\n"+"请求地址:"+String(describing: urlStr.removingPercentEncoding!)+"\n"+"请求方式:"+"=\(String(describing: request.httpMethod!))"+"\n"+"请求头部:"+"\(String(describing: request.allHTTPHeaderFields!))")
  50. }
  51. done(.success(request))
  52. } catch {
  53. done(.failure(MoyaError.underlying(error, nil)))
  54. }
  55. }
  56. /// NetworkActivityPlugin插件用来监听网络请求,界面上做相应的展示
  57. ///但这里我没怎么用这个。。。 loading的逻辑直接放在网络处理里面了
  58. private let networkPlugin = NetworkActivityPlugin.init { (changeType, targetType) in
  59. print("networkPlugin \(changeType)")
  60. //targetType 是当前请求的基本信息
  61. switch(changeType){
  62. case .began:
  63. DispatchQueue.main.async(execute: { () -> Void in
  64. UIApplication.shared.isNetworkActivityIndicatorVisible = true
  65. })
  66. case .ended:
  67. DispatchQueue.main.async(execute: { () -> Void in
  68. UIApplication.shared.isNetworkActivityIndicatorVisible = false
  69. })
  70. }
  71. }
  72. private let provider = MoyaProvider<MultiTarget>(endpointClosure: myEndpointClosure, requestClosure: requestClosure, plugins: [networkPlugin], trackInflights: false)
  73. /// 基于Alamofire,网络是否连接,,这个方法不建议放到这个类中,可以放在全局的工具类中判断网络链接情况
  74. /// 用get方法是因为这样才会在获取isNetworkConnect时实时判断网络链接请求,如有更好的方法可以fork
  75. private var isNetworkConnect: Bool {
  76. get{
  77. let network = NetworkReachabilityManager()
  78. return network?.isReachable ?? true //无返回就默认网络已连接
  79. }
  80. }
  81. public class SwiftMoyaNetWorkManager: NSObject {
  82. private let disposeBag = DisposeBag()
  83. private var dataBaseName : String = "RainbowPlanet"
  84. private static let _sharedInstance = SwiftMoyaNetWorkManager()
  85. private override init() {} // 私有化init方法
  86. /// 获取单例
  87. ///
  88. /// - Returns: SwiftMoyaNetWorkManager对象
  89. class func shared() -> SwiftMoyaNetWorkManager {
  90. return _sharedInstance
  91. }
  92. /// 成功回调 对象
  93. typealias successCallback = (_ data: Any) -> Void
  94. /// 成功回调带泛型 数组
  95. typealias successCallArrayback = (_ data: [Any]) -> Void
  96. /// 成功回调带泛型 对象
  97. typealias successCallTBack = (_ T: BaseMappable) -> Void
  98. /// 成功回调带泛型 数组
  99. typealias successCallArrayTback = (_ T: [BaseMappable]) -> Void
  100. typealias falseCallback = () -> Void
  101. var falseCallback : falseCallback?
  102. // MARK: 泛型网络请求返回对象
  103. /// 泛型网络请求返回对象
  104. /// 网络请求
  105. ///
  106. /// - Parameters:
  107. /// - type: 模型
  108. /// - target: 请求地址加参数
  109. /// - isCache: 是否缓存
  110. /// - completion: 回调
  111. func request<T: BaseMappable>(_ type: T.Type ,target: MultiTarget,isCustomAlert:Bool = false,completion: @escaping successCallTBack) -> Void {
  112. //判断是否链接网络
  113. if !isNetworkConnect{
  114. SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
  115. return
  116. }
  117. provider.rx
  118. .request(target)
  119. .map(T.self)
  120. .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
  121. .observeOn(MainScheduler.instance)
  122. .subscribe(onSuccess: { [weak self] element in
  123. guard let element = element else {
  124. if let falseCallback = self?.falseCallback {
  125. falseCallback()
  126. }
  127. return
  128. }
  129. completion(element)
  130. }) {
  131. [weak self] (error) in
  132. if let falseCallback = self?.falseCallback {
  133. falseCallback()
  134. }
  135. SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
  136. }
  137. .disposed(by: disposeBag)
  138. }
  139. // MARK: 泛型网络请求返回数组对象
  140. /// 泛型网络请求返回数组对象
  141. ///
  142. /// - Parameters:
  143. /// - type: 模型
  144. /// - target: 请求地址加参数
  145. /// - isCache: 是否缓存
  146. /// - completion: 回调
  147. func requestArray<T: BaseMappable>(_ type: T.Type ,target: MultiTarget,isCustomAlert:Bool = false,completion: @escaping successCallArrayTback) -> Void {
  148. //判断是否链接网络
  149. if !isNetworkConnect{
  150. SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
  151. return
  152. }
  153. provider.rx
  154. .request(target)
  155. .mapArray(T.self)
  156. .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
  157. .observeOn(MainScheduler.instance)
  158. .subscribe(onSuccess: { [weak self] element in
  159. guard let element = element else {
  160. if let falseCallback = self?.falseCallback {
  161. falseCallback()
  162. }
  163. return
  164. }
  165. completion(element)
  166. }) {
  167. [weak self] (error) in
  168. if let falseCallback = self?.falseCallback {
  169. falseCallback()
  170. }
  171. SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
  172. }
  173. .disposed(by: disposeBag)
  174. }
  175. /// 缓存请求
  176. ///
  177. /// - Parameters:
  178. /// - target: 请求地址加参数
  179. /// - alwaysFetchCache: 是否总是缓存
  180. /// - cacheType: 缓存类型
  181. /// - completion: 请求成功回调
  182. // func cacheRequest<T: BaseMappable>(_ type: T.Type,target: MultiTarget,isCustomAlert:Bool = false,alwaysFetchCache: Bool = false,cacheType: MMCache.CacheKeyType = .default,completion: @escaping successCallback) -> Void {
  183. //
  184. // //判断是否链接网络
  185. // if !isNetworkConnect{
  186. // SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
  187. // return
  188. // }
  189. // var cacheResponse: Response? = nil
  190. // if alwaysFetchCache {
  191. // cacheResponse = MMCache.shared.fetchResponseCache(target: target)
  192. // self.getResponseStatusCode(response: cacheResponse!, isCustomAlert: isCustomAlert, completion: completion)
  193. // } else {
  194. // if MMCache.shared.isNoRecord(target, cacheType: cacheType) {
  195. // MMCache.shared.record(target)
  196. // cacheResponse = MMCache.shared.fetchResponseCache(target: target)
  197. // self.getResponseStatusCode(response: cacheResponse!, isCustomAlert: isCustomAlert, completion: completion)
  198. // }
  199. // }
  200. // provider.rx
  201. // .request(target)
  202. // .map(T.self)
  203. // .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
  204. // .observeOn(MainScheduler.instance)
  205. // .subscribe(onSuccess: { [weak self] response in
  206. // MMCache.shared.cacheResponse(response as! Response, target: target)
  207. // self?.getResponseStatusCode(response: response as! Response, isCustomAlert: isCustomAlert, completion: completion)
  208. // }) {
  209. // [weak self] (error) in
  210. // if let falseCallback = self?.falseCallback {
  211. // falseCallback()
  212. // }
  213. // SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
  214. // }
  215. // .disposed(by: disposeBag)
  216. //
  217. // }
  218. // MARK: 网络请求返回RootModel
  219. /// 网络请求返回RootModel
  220. ///
  221. /// - Parameters:
  222. /// - target: 请求地址加参数
  223. /// - completion: 请求成功回调
  224. func request(target: MultiTarget,isCustomAlert:Bool = false,completion: @escaping successCallback) -> Void {
  225. //判断是否链接网络
  226. if !isNetworkConnect{
  227. SwiftProgressHUD.shared().showText("网络链接失败,请检查网络")
  228. return
  229. }
  230. provider.rx
  231. .request(target)
  232. .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
  233. .observeOn(MainScheduler.instance)
  234. .subscribe(onSuccess: { [weak self] response in
  235. self?.getResponseStatusCode(response: response, completion: completion)
  236. }) {
  237. [weak self] (error) in
  238. SwiftProgressHUD.shared().showText(error.localizedDescription)
  239. if let falseCallback = self?.falseCallback {
  240. falseCallback()
  241. }
  242. }
  243. .disposed(by: disposeBag)
  244. }
  245. // MARK: 网络请求返回Value
  246. /// 网络请求返回Value
  247. ///
  248. /// - Parameters:
  249. /// - target: 请求地址加参数
  250. /// - completion: 请求成功回调
  251. func requestValue(target: MultiTarget,completion: @escaping successCallback) -> Void {
  252. //判断是否链接网络
  253. if !isNetworkConnect{
  254. SwiftProgressHUD.shared().showText("网络链接失败,请检查网络")
  255. return
  256. }
  257. provider.rx
  258. .request(target)
  259. .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
  260. .observeOn(MainScheduler.instance)
  261. .subscribe(onSuccess: { [weak self] response in
  262. self?.getResponseValueStatusCode(response: response, completion: completion)
  263. }) {
  264. [weak self] (error) in
  265. SwiftProgressHUD.shared().showText(error.localizedDescription)
  266. if let falseCallback = self?.falseCallback {
  267. falseCallback()
  268. }
  269. }
  270. .disposed(by: disposeBag)
  271. }
  272. // MARK: 网络请求返回数组
  273. /// 网络请求返回数组
  274. ///
  275. /// - Parameters:
  276. /// - target: 请求地址加参数
  277. /// - completion: 请求成功回调
  278. func requestArray(target: MultiTarget,completion: @escaping successCallArrayback) -> Void {
  279. //判断是否链接网络
  280. if !isNetworkConnect{
  281. SwiftProgressHUD.shared().showText("网络链接失败,请检查网络")
  282. return
  283. }
  284. provider.rx
  285. .request(target)
  286. .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
  287. .observeOn(MainScheduler.instance)
  288. .subscribe(onSuccess: { [weak self] response in
  289. self?.getResponseArrayStatusCode(response: response, completion: completion)
  290. }) {
  291. [weak self] (error) in
  292. SwiftProgressHUD.shared().showText(error.localizedDescription)
  293. if let falseCallback = self?.falseCallback {
  294. falseCallback()
  295. }
  296. }
  297. .disposed(by: disposeBag)
  298. }
  299. /// 缓存请求
  300. ///
  301. /// - Parameters:
  302. /// - target: 请求地址加参数
  303. /// - alwaysFetchCache: 是否总是缓存
  304. /// - cacheType: 缓存类型
  305. /// - completion: 请求成功回调
  306. // func cacheRequest(target: MultiTarget,isCustomAlert:Bool = false,alwaysFetchCache: Bool = false,cacheType: MMCache.CacheKeyType = .default,completion: @escaping successCallback) -> Void {
  307. //
  308. // //判断是否链接网络
  309. // if !isNetworkConnect{
  310. // SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
  311. // return
  312. // }
  313. // var cacheResponse: Response? = nil
  314. // if alwaysFetchCache {
  315. // cacheResponse = MMCache.shared.fetchResponseCache(target: target)
  316. // self.getResponseStatusCode(response: cacheResponse!, isCustomAlert: isCustomAlert, completion: completion)
  317. // } else {
  318. // if MMCache.shared.isNoRecord(target, cacheType: cacheType) {
  319. // MMCache.shared.record(target)
  320. // cacheResponse = MMCache.shared.fetchResponseCache(target: target)
  321. // self.getResponseStatusCode(response: cacheResponse!, isCustomAlert: isCustomAlert, completion: completion)
  322. // }
  323. // }
  324. // provider.rx
  325. // .request(target)
  326. // .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
  327. // .observeOn(MainScheduler.instance)
  328. // .subscribe(onSuccess: { [weak self] response in
  329. // MMCache.shared.cacheResponse(response, target: target)
  330. // self?.getResponseStatusCode(response: response, isCustomAlert: isCustomAlert, completion: completion)
  331. // }) {
  332. // [weak self] (error) in
  333. // if let falseCallback = self?.falseCallback {
  334. // falseCallback()
  335. // }
  336. // SwiftProgressHUD.shared().showError("网络链接失败,请检查网络")
  337. // }
  338. // .disposed(by: disposeBag)
  339. //
  340. // }
  341. // MARK: 取消所有请求
  342. /// 取消所有请求
  343. func cancelAllRequest() {
  344. provider.manager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
  345. dataTasks.forEach { $0.cancel() }
  346. uploadTasks.forEach { $0.cancel() }
  347. downloadTasks.forEach { $0.cancel() }
  348. }
  349. }
  350. // MARK: 取消指定请求
  351. /// 取消指定请求
  352. ///
  353. /// - Parameter url: 指定的网络请求地址
  354. func cancelDesignationRequest(url:String) {
  355. provider.manager.session.getTasksWithCompletionHandler {
  356. (sessionDataTask, uploadData, downloadData) in
  357. sessionDataTask.forEach {
  358. //只取消指定url的请求
  359. if ($0.originalRequest?.url?.absoluteString == url) {
  360. $0.cancel()
  361. }
  362. }
  363. }
  364. }
  365. }
  366. // MARK: - StatusCode
  367. extension SwiftMoyaNetWorkManager {
  368. // MARK: 返回RootModel
  369. /// 获取状态码返回RootModel
  370. ///
  371. /// - Parameters:
  372. /// - response: 响应结果
  373. /// - completion: 回调
  374. private func getResponseStatusCode(response:Response, completion: @escaping successCallback) -> Void {
  375. let json = try? JSON(response.mapJSON())
  376. if response.statusCode == 200 {
  377. let url = String(describing: response.request!.url!)
  378. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\njson=\n\(json!.description)")
  379. let json = JSON(parseJSON: json!.description)
  380. let rootModel = RootModel(JSONString: json.description)
  381. let data = JSON(json["data"]).description
  382. rootModel?.data = data
  383. if rootModel!.code == 0 {
  384. completion(rootModel as Any)
  385. }else if rootModel!.code == 1 {
  386. SwiftProgressHUD.shared().showText(rootModel!.msg ?? "信息有误!!!", textAlignment: .left)
  387. if let falseCallback = self.falseCallback {
  388. falseCallback()
  389. }
  390. }else {
  391. SwiftProgressHUD.shared().showError(rootModel!.msg ?? "信息有误!!!")
  392. if let falseCallback = self.falseCallback {
  393. falseCallback()
  394. }
  395. }
  396. }else if response.statusCode == 401 {
  397. let url = String(describing: response.request!.url!)
  398. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\njson=\n\(json!.description)")
  399. let infoModel = InfoModel(JSONString: json?.description ?? "")
  400. kAppDelegate.setLoginController()
  401. SwiftProgressHUD.shared().showText(infoModel!.message ?? "登录过期,请重新登录")
  402. if let falseCallback = self.falseCallback {
  403. falseCallback()
  404. }
  405. } else {
  406. let url = String(describing: response.request!.url!)
  407. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\nerror=\n\(response.description)");
  408. if let falseCallback = self.falseCallback {
  409. falseCallback()
  410. }
  411. }
  412. }
  413. // MARK: 返回Vaule
  414. /// 获取状态码返回Vaule
  415. ///
  416. /// - Parameters:
  417. /// - response: 响应结果
  418. /// - completion: 回调
  419. private func getResponseValueStatusCode(response:Response, completion: @escaping successCallback) -> Void {
  420. let json = try? JSON(response.mapJSON())
  421. if response.statusCode == 200 {
  422. let url = String(describing: response.request!.url!)
  423. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\njson=\n\(json!.description)")
  424. let json = JSON(parseJSON: json!.description)
  425. let rootModel = RootModel(JSONString: json.description)
  426. let data = JSON(json["data"]).description
  427. rootModel?.data = data
  428. if rootModel!.code == 0 {
  429. completion(rootModel?.data as Any)
  430. }else if rootModel!.code == 1 {
  431. SwiftProgressHUD.shared().showText(rootModel!.msg ?? "信息有误!!!", textAlignment: .left)
  432. if let falseCallback = self.falseCallback {
  433. falseCallback()
  434. }
  435. }else {
  436. SwiftProgressHUD.shared().showError(rootModel!.msg ?? "信息有误!!!")
  437. if let falseCallback = self.falseCallback {
  438. falseCallback()
  439. }
  440. }
  441. }else if response.statusCode == 401 {
  442. let url = String(describing: response.request!.url!)
  443. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\njson=\n\(json!.description)")
  444. let infoModel = InfoModel(JSONString: json?.description ?? "")
  445. kAppDelegate.setLoginController()
  446. SwiftProgressHUD.shared().showText(infoModel!.message ?? "登录过期,请重新登录")
  447. if let falseCallback = self.falseCallback {
  448. falseCallback()
  449. }
  450. } else {
  451. let url = String(describing: response.request!.url!)
  452. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\nerror=\n\(response.description)");
  453. SwiftProgressHUD.shared().showText(response.description)
  454. if let falseCallback = self.falseCallback {
  455. falseCallback()
  456. }
  457. }
  458. }
  459. // MARK: 返回数组
  460. /// 获取状态码返回数组
  461. ///
  462. /// - Parameters:
  463. /// - response: 响应结果 数组
  464. /// - completion: 回调
  465. private func getResponseArrayStatusCode(response:Response, completion: @escaping successCallArrayback) -> Void {
  466. let json = try? JSON(response.mapJSON())
  467. if response.statusCode == 200 {
  468. let url = String(describing: response.request!.url!)
  469. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\njson=\n\(json!.description)")
  470. let json = JSON(parseJSON: json!.description)
  471. let rootModel = RootModel(JSONString: json.description)
  472. let data = JSON(json["data"]).description
  473. rootModel?.data = data
  474. if rootModel!.code == 0 {
  475. let array = JSON(parseJSON: rootModel?.data ?? "").arrayObject ?? Array<Any>()
  476. completion(array)
  477. }else if rootModel!.code == 1 {
  478. SwiftProgressHUD.shared().showText(rootModel!.msg ?? "信息有误!!!", textAlignment: .left)
  479. if let falseCallback = self.falseCallback {
  480. falseCallback()
  481. }
  482. }else {
  483. SwiftProgressHUD.shared().showError(rootModel!.msg ?? "信息有误!!!")
  484. if let falseCallback = self.falseCallback {
  485. falseCallback()
  486. }
  487. }
  488. }else if response.statusCode == 401 {
  489. let url = String(describing: response.request!.url!)
  490. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\njson=\n\(json!.description)")
  491. let infoModel = InfoModel(JSONString: json?.description ?? "")
  492. kAppDelegate.setLoginController()
  493. SwiftProgressHUD.shared().showText(infoModel!.message ?? "登录过期,请重新登录")
  494. if let falseCallback = self.falseCallback {
  495. falseCallback()
  496. }
  497. } else {
  498. let url = String(describing: response.request!.url!)
  499. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\nerror=\n\(response.description)");
  500. SwiftProgressHUD.shared().showText(response.description)
  501. if let falseCallback = self.falseCallback {
  502. falseCallback()
  503. }
  504. }
  505. }
  506. }
  507. // MARK: - 泛型
  508. extension PrimitiveSequence where TraitType == SingleTrait, ElementType == Response {
  509. // MARK: 泛型返回对象
  510. func map<T: BaseMappable>(_ type: T.Type) -> Single<T?> {
  511. return flatMap { response -> Single<T?> in
  512. do {
  513. let json = try JSON(response.mapJSON())
  514. if response.statusCode == 200 {
  515. NXLLog("\nurl=\(String(describing: response.request!.url!))\nstatusCode=\(response.statusCode)\njson=\n\(json.description)");
  516. let json = JSON(parseJSON: json.description)
  517. let rootModel = RootModel(JSONString: json.description)
  518. let data = JSON(json["data"]).description
  519. rootModel?.data = data
  520. if rootModel!.code == 0 {
  521. let mapper = T(JSONString: rootModel!.data ?? "")
  522. return Single<T?>.just(mapper)
  523. }else if rootModel!.code == 1 {
  524. SwiftProgressHUD.shared().showError(rootModel!.msg ?? "信息有误!!!")
  525. return Single<T?>.just(nil)
  526. }else {
  527. SwiftProgressHUD.shared().showError(rootModel!.msg ?? "信息有误!!!")
  528. return Single<T?>.just(nil)
  529. }
  530. }else if response.statusCode == 401 {
  531. let url = String(describing: response.request!.url!)
  532. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\njson=\n\(json.description)")
  533. let infoModel = InfoModel(JSONString: json.description)
  534. SwiftProgressHUD.shared().showText(infoModel!.message ?? "登录过期,请重新登录")
  535. kAppDelegate.setLoginController()
  536. return Single<T?>.just(nil)
  537. }else {
  538. let url = String(describing: response.request!.url!)
  539. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\nerror=\n\(response.description)");
  540. SwiftProgressHUD.shared().showText(response.description)
  541. return Single<T?>.just(nil)
  542. }
  543. } catch {
  544. let url = String(describing: response.request!.url!)
  545. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\nerror=\n\(response.description)")
  546. SwiftProgressHUD.shared().showText(response.description)
  547. return Single<T?>.just(nil)
  548. }
  549. }
  550. }
  551. // MARK: 泛型返回对象数组
  552. func mapArray<T: BaseMappable>(_ type: T.Type) -> Single<[T]?> {
  553. return flatMap { response -> Single<[T]?> in
  554. do {
  555. let json = try JSON(response.mapJSON())
  556. if response.statusCode == 200 {
  557. let url = String(describing: response.request!.url!)
  558. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\njson=\n\(json.description)")
  559. let json = JSON(parseJSON: json.description)
  560. let rootModel = RootModel(JSONString: json.description)
  561. let data = JSON(json["data"]).description
  562. rootModel?.data = data
  563. if rootModel!.code == 0 {
  564. let mapper = Mapper<T>().mapArray(JSONString: rootModel!.data!)
  565. return Single<[T]?>.just(mapper)
  566. }else if rootModel!.code == 1 {
  567. SwiftProgressHUD.shared().showText(rootModel!.msg ?? "信息有误!!!", textAlignment: .left)
  568. return Single<[T]?>.just(nil)
  569. }else {
  570. SwiftProgressHUD.shared().showText(rootModel!.msg ?? "信息有误!!!", textAlignment: .left)
  571. return Single<[T]?>.just(nil)
  572. }
  573. }else if response.statusCode == 401 {
  574. let url = String(describing: response.request!.url!)
  575. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\njson=\n\(json.description)")
  576. let infoModel = InfoModel(JSONString: json.description)
  577. SwiftProgressHUD.shared().showText(infoModel!.message ?? "登录过期,请重新登录")
  578. kAppDelegate.setLoginController()
  579. return Single<[T]?>.just(nil)
  580. }else {
  581. let url = String(describing: response.request!.url!)
  582. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\nerror=\n\(response.description)");
  583. SwiftProgressHUD.shared().showText(response.description)
  584. return Single<[T]?>.just(nil)
  585. }
  586. } catch {
  587. let url = String(describing: response.request!.url!)
  588. NXLLog("\nurl=\(url)\nstatusCode=\(response.statusCode)\nerror=\n\(response.description)")
  589. SwiftProgressHUD.shared().showText(response.description)
  590. return Single<[T]?>.just(nil)
  591. }
  592. }
  593. }
  594. }