From 954fd7d73b1f8d2ee74467200bf74fbb456b1e1a Mon Sep 17 00:00:00 2001 From: luyiyang Date: Fri, 27 Sep 2019 15:54:11 +0800 Subject: [PATCH 01/17] =?UTF-8?q?fixed:=20=E6=95=B0=E6=8D=AE=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=A4=B1=E8=B4=A5=E6=83=85=E5=86=B5=EF=BC=8C=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E4=B8=8D=E5=88=B0=E5=A4=B1=E8=B4=A5=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Network/Classes/Network/NetworkRequest.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Network/Classes/Network/NetworkRequest.swift b/Network/Classes/Network/NetworkRequest.swift index 83e58c0..d571e55 100644 --- a/Network/Classes/Network/NetworkRequest.swift +++ b/Network/Classes/Network/NetworkRequest.swift @@ -32,10 +32,18 @@ public func request( }) .shareOnce() + let networkError = error.asObservable().map { error -> NetworkError in + if let error = error as? NetworkError { + return error + } else { + return .error(value: "解析错误") + } + } + return ( result, isActivity.asObservable(), - error.asObservable().map({ $0 as? NetworkError }).filterNil() + networkError ) } From 79734db95d9e6513f503869b0881266823a973dd Mon Sep 17 00:00:00 2001 From: luyiyang Date: Mon, 30 Sep 2019 09:42:00 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=83=85=E5=86=B5=EF=BC=8Cerror=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E7=BB=99filter=E6=8E=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Network/Classes/Network/NetworkRequest.swift | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Network/Classes/Network/NetworkRequest.swift b/Network/Classes/Network/NetworkRequest.swift index d571e55..d1059e0 100644 --- a/Network/Classes/Network/NetworkRequest.swift +++ b/Network/Classes/Network/NetworkRequest.swift @@ -64,10 +64,18 @@ public func network( }) .shareOnce() + let networkError = error.asObservable().map { error -> NetworkError in + if let error = error as? NetworkError { + return error + } else { + return .error(value: "解析错误") + } + } + return ( result, isActivity.asObservable(), - error.asObservable().map({ $0 as? NetworkError }).filterNil() + networkError ) } @@ -90,10 +98,18 @@ public func network( }) .shareOnce() + let networkError = error.asObservable().map { error -> NetworkError in + if let error = error as? NetworkError { + return error + } else { + return .error(value: "解析错误") + } + } + return ( result, isActivity.asObservable(), - error.asObservable().map({ $0 as? NetworkError }).filterNil() + networkError ) } From 98e5848e30eae026fa4a0f2721438838afa16d18 Mon Sep 17 00:00:00 2001 From: luyiyang Date: Sat, 12 Oct 2019 18:09:48 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Network/Classes/Network/NetworkRequest.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Network/Classes/Network/NetworkRequest.swift b/Network/Classes/Network/NetworkRequest.swift index d1059e0..56f1370 100644 --- a/Network/Classes/Network/NetworkRequest.swift +++ b/Network/Classes/Network/NetworkRequest.swift @@ -36,7 +36,7 @@ public func request( if let error = error as? NetworkError { return error } else { - return .error(value: "解析错误") + return .error(value: error.localizedDescription) } } @@ -68,7 +68,7 @@ public func network( if let error = error as? NetworkError { return error } else { - return .error(value: "解析错误") + return .error(value: error.localizedDescription) } } @@ -102,7 +102,7 @@ public func network( if let error = error as? NetworkError { return error } else { - return .error(value: "解析错误") + return .error(value: error.localizedDescription) } } From 0e5c9949da4501c4b7a63d8298437c198a6cf624 Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 16 Oct 2019 14:58:51 +0800 Subject: [PATCH 04/17] add hashRequest & stringRequest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增两个request方法 返回可为空 --- Example/Podfile | 3 - Example/Podfile.lock | 14 ++-- Example/RHNetwork.xcodeproj/project.pbxproj | 52 ++++++++------- Example/RHNetwork/AppDelegate.swift | 2 +- Example/Tests/Tests.swift | 2 +- Network/Classes/Network/CacheType.swift | 2 +- Network/Classes/Network/MoyaProvider+Rx.swift | 66 +++++++++++++++++++ .../Classes/Network/Observable+Response.swift | 12 ++-- 8 files changed, 109 insertions(+), 44 deletions(-) diff --git a/Example/Podfile b/Example/Podfile index f6cdfc5..1e08f5e 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -1,11 +1,8 @@ use_frameworks! - target 'RHNetwork_Example' do pod 'Network.swift', :path => '../' target 'RHNetwork_Tests' do inherit! :search_paths - - end end diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 30b885c..4c0b94b 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,17 +1,17 @@ PODS: - - Alamofire (4.8.2) + - Alamofire (4.9.0) - Moya (13.0.1): - Moya/Core (= 13.0.1) - Moya/Core (13.0.1): - Alamofire (~> 4.1) - Result (~> 4.1) - - Network.swift (0.7.5): + - Network.swift (0.8.5): - Moya (~> 13.0) - RxSwift (~> 5.0) - RxSwiftExtensions.swift (~> 0.2) - Result (4.1.0) - RxSwift (5.0.0) - - RxSwiftExtensions.swift (0.2.3): + - RxSwiftExtensions.swift (0.2.5): - RxSwift (~> 5.0) DEPENDENCIES: @@ -30,13 +30,13 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - Alamofire: ae5c501addb7afdbb13687d7f2f722c78734c2d3 + Alamofire: afc3e7c6db61476cb45cdd23fed06bad03bbc321 Moya: f4a4b80ff2f8a4ffc208dfb31cd91636622fee6e - Network.swift: 93a56afff15c680c84fe20e57a4805be9b06ff9b + Network.swift: 7ffbab5d4fb4c833f2b0a02700a447abb90115a5 Result: bd966fac789cc6c1563440b348ab2598cc24d5c7 RxSwift: 8b0671caa829a763bbce7271095859121cbd895f - RxSwiftExtensions.swift: 7f955609c3d3e03bd9f731fc89b9725d711c5b3e + RxSwiftExtensions.swift: 2e288839301728e5de4de06bf143359ed75198c3 -PODFILE CHECKSUM: 46cedb2e0fda0c68bff76ee268c81d537ed747f6 +PODFILE CHECKSUM: 6ab97ae7f336ec2ae0d893569e6b4fdd4ecad3fc COCOAPODS: 1.6.2 diff --git a/Example/RHNetwork.xcodeproj/project.pbxproj b/Example/RHNetwork.xcodeproj/project.pbxproj index a850c16..b53bcc0 100644 --- a/Example/RHNetwork.xcodeproj/project.pbxproj +++ b/Example/RHNetwork.xcodeproj/project.pbxproj @@ -169,7 +169,7 @@ 607FACCC1AFB9204008FA782 /* Sources */, 607FACCD1AFB9204008FA782 /* Frameworks */, 607FACCE1AFB9204008FA782 /* Resources */, - 51B91A22A39F119CB0866663 /* [CP] Embed Pods Frameworks */, + 129B3BB7DA7779FE8D62E709 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -261,7 +261,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 2F16F8D066214FE0086ACEDF /* [CP] Check Pods Manifest.lock */ = { + 129B3BB7DA7779FE8D62E709 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -269,21 +269,31 @@ inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", + "${PODS_ROOT}/Target Support Files/Pods-RHNetwork_Example/Pods-RHNetwork_Example-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", + "${BUILT_PRODUCTS_DIR}/Moya/Moya.framework", + "${BUILT_PRODUCTS_DIR}/Network.swift/Network.framework", + "${BUILT_PRODUCTS_DIR}/Result/Result.framework", + "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", + "${BUILT_PRODUCTS_DIR}/RxSwiftExtensions.swift/RxSwiftExtensions.framework", ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RHNetwork_Example-checkManifestLockResult.txt", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Network.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Result.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwiftExtensions.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RHNetwork_Example/Pods-RHNetwork_Example-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 51B91A22A39F119CB0866663 /* [CP] Embed Pods Frameworks */ = { + 2F16F8D066214FE0086ACEDF /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -291,28 +301,18 @@ inputFileListPaths = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RHNetwork_Example/Pods-RHNetwork_Example-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", - "${BUILT_PRODUCTS_DIR}/Moya/Moya.framework", - "${BUILT_PRODUCTS_DIR}/Network.swift/Network.framework", - "${BUILT_PRODUCTS_DIR}/Result/Result.framework", - "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", - "${BUILT_PRODUCTS_DIR}/RxSwiftExtensions.swift/RxSwiftExtensions.framework", + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Embed Pods Frameworks"; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Network.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Result.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwiftExtensions.framework", + "$(DERIVED_FILE_DIR)/Pods-RHNetwork_Example-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RHNetwork_Example/Pods-RHNetwork_Example-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 9CEC66C4A061A89BDD31C31A /* [CP] Check Pods Manifest.lock */ = { @@ -493,10 +493,11 @@ INFOPLIST_FILE = RHNetwork/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; + ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -508,10 +509,11 @@ INFOPLIST_FILE = RHNetwork/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; + ONLY_ACTIVE_ARCH = NO; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Example/RHNetwork/AppDelegate.swift b/Example/RHNetwork/AppDelegate.swift index 3bda664..d87b3ec 100644 --- a/Example/RHNetwork/AppDelegate.swift +++ b/Example/RHNetwork/AppDelegate.swift @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/Example/Tests/Tests.swift b/Example/Tests/Tests.swift index 0b93ac3..511ec5d 100644 --- a/Example/Tests/Tests.swift +++ b/Example/Tests/Tests.swift @@ -1,5 +1,5 @@ import XCTest -import RHNetwork +import Network class Tests: XCTestCase { diff --git a/Network/Classes/Network/CacheType.swift b/Network/Classes/Network/CacheType.swift index f7e6af2..ff68b59 100644 --- a/Network/Classes/Network/CacheType.swift +++ b/Network/Classes/Network/CacheType.swift @@ -4,7 +4,7 @@ // Created by 荣恒 on 2019/3/29. // Copyright © 2019 荣恒. All rights reserved. // - +import Foundation import Moya public protocol CacheType where Self : TargetType { diff --git a/Network/Classes/Network/MoyaProvider+Rx.swift b/Network/Classes/Network/MoyaProvider+Rx.swift index 1d4c667..7666dc2 100755 --- a/Network/Classes/Network/MoyaProvider+Rx.swift +++ b/Network/Classes/Network/MoyaProvider+Rx.swift @@ -95,6 +95,72 @@ public extension Reactive where Base: MoyaProviderType { } +// MARK: - 扩展 Provider request 方法 +public extension Reactive where Base: MoyaProviderType { + + /// 返回结果为字典,返回为data的属性 如果是字典则返回字典 如果不为字典则返回nil + func hashRequest(_ token : Base.Target, + dataKey : String = NetworkConfigure.data, + codeKey : String = NetworkConfigure.code, + messageKey : String = NetworkConfigure.message, + successCode : Int = NetworkConfigure.success + ) -> Observable<[String: Any]?> { + + return request(token).flatMap({ response -> Observable<[String: Any]?> in + + guard let jsonDictionary = (try? response.mapJSON()) as? NSDictionary else { + let error = "无效的json格式" + return .error(NetworkError.error(value: error)) + } + guard let code = jsonDictionary.value(forKeyPath: codeKey) as? Int else { + let error = "服务器code解析错误\n\(responseDescribe(response) ?? "")" + return .error(NetworkError.error(value: error)) + } + guard code == successCode else { + handleServiceCode(code) + let message = (jsonDictionary.value(forKeyPath: messageKey) as? String) ?? "code不等于\(successCode)" + return .error(NetworkError.service(code: code, message: message)) + } + + if let object = jsonDictionary.value(forKeyPath: dataKey) as? [String: Any] { + return .just(object) + } + return .just(nil) + }) + } + + /// 返回结果为字符串,返回为dataKey的属性 可为空 + func stringRequest(_ token : Base.Target, + dataKey : String = NetworkConfigure.data, + codeKey : String = NetworkConfigure.code, + messageKey : String = NetworkConfigure.message, + successCode : Int = NetworkConfigure.success + ) -> Observable { + + return request(token).flatMap({ response -> Observable in + + guard let jsonDictionary = (try? response.mapJSON()) as? NSDictionary else { + let error = "无效的json格式" + return .error(NetworkError.error(value: error)) + } + guard let code = jsonDictionary.value(forKeyPath: codeKey) as? Int else { + let error = "服务器code解析错误\n\(responseDescribe(response) ?? "")" + return .error(NetworkError.error(value: error)) + } + guard code == successCode else { + handleServiceCode(code) + let message = (jsonDictionary.value(forKeyPath: messageKey) as? String) ?? "code不等于\(successCode)" + return .error(NetworkError.service(code: code, message: message)) + } + + if let object = jsonDictionary.value(forKeyPath: dataKey) as? String { + return .just(object) + } + return .just(nil) + }) + } +} + /// 解析JSON private func decoderJSON(_ type: T.Type, json: NSDictionary, forKeyPath keyPath: String) throws -> T { guard let jsonObject = json.value(forKeyPath: keyPath) else { diff --git a/Network/Classes/Network/Observable+Response.swift b/Network/Classes/Network/Observable+Response.swift index c3a9a1f..3469e96 100755 --- a/Network/Classes/Network/Observable+Response.swift +++ b/Network/Classes/Network/Observable+Response.swift @@ -9,25 +9,25 @@ import Moya #endif // MARK: - Extension for processing raw NSData generated by network access -extension ObservableType where E == Response { +extension ObservableType where Element == Response { /// Filters out responses that don't fall within the given range, generating errors when others are encountered. - public func filter(statusCodes: R) -> Observable where R.Bound == Int { + public func filter(statusCodes: R) -> Observable where R.Bound == Int { return flatMap { Observable.just(try $0.filter(statusCodes: statusCodes)) } } /// Filters out responses that has the specified `statusCode`. - public func filter(statusCode: Int) -> Observable { + public func filter(statusCode: Int) -> Observable { return flatMap { Observable.just(try $0.filter(statusCode: statusCode)) } } /// Filters out responses where `statusCode` falls within the range 200 - 299. - public func filterSuccessfulStatusCodes() -> Observable { + public func filterSuccessfulStatusCodes() -> Observable { return flatMap { Observable.just(try $0.filterSuccessfulStatusCodes()) } } /// Filters out responses where `statusCode` falls within the range 200 - 399 - public func filterSuccessfulStatusAndRedirectCodes() -> Observable { + public func filterSuccessfulStatusAndRedirectCodes() -> Observable { return flatMap { Observable.just(try $0.filterSuccessfulStatusAndRedirectCodes()) } } @@ -52,7 +52,7 @@ extension ObservableType where E == Response { } } -extension ObservableType where E == ProgressResponse { +extension ObservableType where Element == ProgressResponse { /** Filter completed progress response and maps to actual response From ca68739e917f4a57ede663f45ebcb34b337d809a Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 16 Oct 2019 15:33:46 +0800 Subject: [PATCH 05/17] add ResponsePlugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增一个 ResponsePlugin 可以拦截不对的数据 可以把ResponsePlugin变成可配置的 --- Network/Classes/Network/MoyaProvider+Rx.swift | 12 ++++ ResponsePlugin.swift | 67 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 ResponsePlugin.swift diff --git a/Network/Classes/Network/MoyaProvider+Rx.swift b/Network/Classes/Network/MoyaProvider+Rx.swift index 7666dc2..5ed2200 100755 --- a/Network/Classes/Network/MoyaProvider+Rx.swift +++ b/Network/Classes/Network/MoyaProvider+Rx.swift @@ -33,6 +33,18 @@ public extension Reactive where Base: MoyaProviderType { } } + /// 带 NetworkConfigure 的 请求 返回 + func responseRequest(_ token : Base.Target, + dataKey : String = NetworkConfigure.data, + codeKey : String = NetworkConfigure.code, + messageKey : String = NetworkConfigure.message, + successCode : Int = NetworkConfigure.success + ) -> Observable { + return request(token).flatMap({ response -> Observable in + return .just(response) + }) + } + /// 请求成功 func request(_ token : Base.Target, codeKey : String = NetworkConfigure.code, diff --git a/ResponsePlugin.swift b/ResponsePlugin.swift new file mode 100644 index 0000000..fa62de3 --- /dev/null +++ b/ResponsePlugin.swift @@ -0,0 +1,67 @@ +// +// ResponsePlugin.swift +// Network.swift +// +// Created by ash on 2019/10/16. +// + +import Foundation + +struct ResponsePlugin: PluginType { + /// Called to modify a result before completion. + func process(_ result: Result, target: TargetType) -> Result { + + switch result { + case .success(let value): + do { + let anyData = try value.mapJSON() + + guard let jsonDictionary = anyData as? NSDictionary else { + let errorStr = "无效的json格式" + return .failure(MoyaError.requestMapping(errorStr)) + } + let codeKey = NetworkConfigure.code + let successCode = NetworkConfigure.success + let messageKey = NetworkConfigure.message + guard let code = jsonDictionary.value(forKeyPath: codeKey) as? Int else { + let error = "服务器code解析错误\n\(cc_responseDescribe(value) ?? "")" + return .failure(MoyaError.requestMapping(error)) + } + guard code == successCode else { + cc_handleServiceCode(code) + let message = (jsonDictionary.value(forKeyPath: messageKey) as? String) ?? "code不等于\(successCode)" + let error = NetworkError.service(code: code, message: message) + return .failure(MoyaError.parameterEncoding(error)) + } + return .success(value) + } catch { + let error = MoyaError.jsonMapping(value) + return .failure(error) + } + case .failure(let error): + return .failure(error) + } + } +} + +/// 处理服务器Code +private func cc_handleServiceCode(_ code: Int) { + switch code { + case 401: + NotificationCenter.default.post(name: .networkService_401, object: nil) + + case 402 ..< 500: + NotificationCenter.default.post(name: .networkService_4XX, object: nil, userInfo: ["code" : code]) + + default: break + } +} + +/// 描述响应,正式环境不打印 +private func cc_responseDescribe(_ response: Response) -> String? { + #if DEBUG + return String(data: response.data, encoding: .utf8) ?? "无response.data" + #else + return nil + #endif +} From 0c9ca4583ecb1878bebc6a2966fc1061a2fa4dc7 Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 16 Oct 2019 15:44:41 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ResponsePlugin.swift => Network/Classes/ResponsePlugin.swift | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ResponsePlugin.swift => Network/Classes/ResponsePlugin.swift (100%) diff --git a/ResponsePlugin.swift b/Network/Classes/ResponsePlugin.swift similarity index 100% rename from ResponsePlugin.swift rename to Network/Classes/ResponsePlugin.swift From 40ca5c217c920e21eee1b312c2e6f6d5ddb04d9e Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 16 Oct 2019 15:47:17 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Network/Classes/{ => Network}/ResponsePlugin.swift | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Network/Classes/{ => Network}/ResponsePlugin.swift (100%) diff --git a/Network/Classes/ResponsePlugin.swift b/Network/Classes/Network/ResponsePlugin.swift similarity index 100% rename from Network/Classes/ResponsePlugin.swift rename to Network/Classes/Network/ResponsePlugin.swift From c10894a015342b9f06a8abcdc42d24a7559c5e3e Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 16 Oct 2019 17:15:32 +0800 Subject: [PATCH 08/17] Update ResponsePlugin.swift --- Network/Classes/Network/ResponsePlugin.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Network/Classes/Network/ResponsePlugin.swift b/Network/Classes/Network/ResponsePlugin.swift index fa62de3..665e25b 100644 --- a/Network/Classes/Network/ResponsePlugin.swift +++ b/Network/Classes/Network/ResponsePlugin.swift @@ -7,7 +7,7 @@ import Foundation -struct ResponsePlugin: PluginType { +public struct ResponsePlugin: PluginType { /// Called to modify a result before completion. func process(_ result: Result, target: TargetType) -> Result { From 58869060086d35dea200e34b7804f5b93661b09e Mon Sep 17 00:00:00 2001 From: ash Date: Wed, 16 Oct 2019 17:32:09 +0800 Subject: [PATCH 09/17] Update ResponsePlugin.swift --- Network/Classes/Network/ResponsePlugin.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Network/Classes/Network/ResponsePlugin.swift b/Network/Classes/Network/ResponsePlugin.swift index 665e25b..d722023 100644 --- a/Network/Classes/Network/ResponsePlugin.swift +++ b/Network/Classes/Network/ResponsePlugin.swift @@ -8,6 +8,8 @@ import Foundation public struct ResponsePlugin: PluginType { + + public init() {} /// Called to modify a result before completion. func process(_ result: Result, target: TargetType) -> Result { From 06ceaa6e487b4aabec93bcc0ad14f2d2cfbea585 Mon Sep 17 00:00:00 2001 From: ash Date: Fri, 18 Oct 2019 09:34:08 +0800 Subject: [PATCH 10/17] Delete ResponsePlugin.swift --- Network/Classes/Network/ResponsePlugin.swift | 69 -------------------- 1 file changed, 69 deletions(-) delete mode 100644 Network/Classes/Network/ResponsePlugin.swift diff --git a/Network/Classes/Network/ResponsePlugin.swift b/Network/Classes/Network/ResponsePlugin.swift deleted file mode 100644 index d722023..0000000 --- a/Network/Classes/Network/ResponsePlugin.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// ResponsePlugin.swift -// Network.swift -// -// Created by ash on 2019/10/16. -// - -import Foundation - -public struct ResponsePlugin: PluginType { - - public init() {} - /// Called to modify a result before completion. - func process(_ result: Result, target: TargetType) -> Result { - - switch result { - case .success(let value): - do { - let anyData = try value.mapJSON() - - guard let jsonDictionary = anyData as? NSDictionary else { - let errorStr = "无效的json格式" - return .failure(MoyaError.requestMapping(errorStr)) - } - let codeKey = NetworkConfigure.code - let successCode = NetworkConfigure.success - let messageKey = NetworkConfigure.message - guard let code = jsonDictionary.value(forKeyPath: codeKey) as? Int else { - let error = "服务器code解析错误\n\(cc_responseDescribe(value) ?? "")" - return .failure(MoyaError.requestMapping(error)) - } - guard code == successCode else { - cc_handleServiceCode(code) - let message = (jsonDictionary.value(forKeyPath: messageKey) as? String) ?? "code不等于\(successCode)" - let error = NetworkError.service(code: code, message: message) - return .failure(MoyaError.parameterEncoding(error)) - } - return .success(value) - } catch { - let error = MoyaError.jsonMapping(value) - return .failure(error) - } - case .failure(let error): - return .failure(error) - } - } -} - -/// 处理服务器Code -private func cc_handleServiceCode(_ code: Int) { - switch code { - case 401: - NotificationCenter.default.post(name: .networkService_401, object: nil) - - case 402 ..< 500: - NotificationCenter.default.post(name: .networkService_4XX, object: nil, userInfo: ["code" : code]) - - default: break - } -} - -/// 描述响应,正式环境不打印 -private func cc_responseDescribe(_ response: Response) -> String? { - #if DEBUG - return String(data: response.data, encoding: .utf8) ?? "无response.data" - #else - return nil - #endif -} From 183a62938224dc8e5f45ebbdec03165c31b9ace2 Mon Sep 17 00:00:00 2001 From: ash Date: Tue, 22 Oct 2019 16:18:19 +0800 Subject: [PATCH 11/17] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20MoyaError=20?= =?UTF-8?q?=E8=BD=AC=E5=8C=96=20NetworkError?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Network/Classes/Network/CacheType.swift | 20 ++++++++++++++++++++ Network/Classes/Network/NetworkRequest.swift | 18 +++--------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Network/Classes/Network/CacheType.swift b/Network/Classes/Network/CacheType.swift index ff68b59..7f841b0 100644 --- a/Network/Classes/Network/CacheType.swift +++ b/Network/Classes/Network/CacheType.swift @@ -41,3 +41,23 @@ public extension TargetType { var sampleData: Data { return Data() } } + + +extension Error { + func mapError() -> NetworkError { + if let error = self as? NetworkError { + return error + } + if let moyaError = self as? MoyaError { + switch moyaError { + case .requestMapping(let message): + return .error(value: message) + case .encodableMapping(let error): + return .network(value: error) + default: + break + } + } + return .error(value: self.localizedDescription) + } +} diff --git a/Network/Classes/Network/NetworkRequest.swift b/Network/Classes/Network/NetworkRequest.swift index 56f1370..ea2ba23 100644 --- a/Network/Classes/Network/NetworkRequest.swift +++ b/Network/Classes/Network/NetworkRequest.swift @@ -33,11 +33,7 @@ public func request( .shareOnce() let networkError = error.asObservable().map { error -> NetworkError in - if let error = error as? NetworkError { - return error - } else { - return .error(value: error.localizedDescription) - } + return error.mapError() } return ( @@ -65,11 +61,7 @@ public func network( .shareOnce() let networkError = error.asObservable().map { error -> NetworkError in - if let error = error as? NetworkError { - return error - } else { - return .error(value: error.localizedDescription) - } + return error.mapError() } return ( @@ -99,11 +91,7 @@ public func network( .shareOnce() let networkError = error.asObservable().map { error -> NetworkError in - if let error = error as? NetworkError { - return error - } else { - return .error(value: error.localizedDescription) - } + return error.mapError() } return ( From 14a59fa00174d924354a0c08f53a5c4cfcef3614 Mon Sep 17 00:00:00 2001 From: ash Date: Thu, 25 Feb 2021 20:21:15 +0800 Subject: [PATCH 12/17] Update Network.swift.podspec --- Network.swift.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Network.swift.podspec b/Network.swift.podspec index dbcef21..8af2ee0 100644 --- a/Network.swift.podspec +++ b/Network.swift.podspec @@ -31,7 +31,7 @@ Pod::Spec.new do |s| s.source_files = 'Network/Classes/**/*.swift' s.dependency 'Moya', '~>13.0' - s.dependency 'RxSwift', '~>5.0' + s.dependency 'RxSwift', '~>6.0' s.dependency 'RxSwiftExtensions.swift', '~>0.2' end From f0c4e24a1db27e82043c49d8852f781abd6bb8a0 Mon Sep 17 00:00:00 2001 From: ash Date: Thu, 25 Feb 2021 20:21:28 +0800 Subject: [PATCH 13/17] Update Network.swift.podspec --- Network.swift.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Network.swift.podspec b/Network.swift.podspec index 8af2ee0..a2d0839 100644 --- a/Network.swift.podspec +++ b/Network.swift.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = 'Network.swift' - s.version = '0.8.5' + s.version = '0.8.6' s.summary = 'Moya+RxSwift 扩展' s.description = <<-DESC From 62289b77096b0cf0d81d47beb146d2f4d1b9b6f4 Mon Sep 17 00:00:00 2001 From: ash Date: Thu, 25 Feb 2021 20:24:54 +0800 Subject: [PATCH 14/17] Update Network.swift.podspec --- Network.swift.podspec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Network.swift.podspec b/Network.swift.podspec index a2d0839..a481c4a 100644 --- a/Network.swift.podspec +++ b/Network.swift.podspec @@ -30,8 +30,8 @@ Pod::Spec.new do |s| s.source_files = 'Network/Classes/**/*.swift' - s.dependency 'Moya', '~>13.0' - s.dependency 'RxSwift', '~>6.0' - s.dependency 'RxSwiftExtensions.swift', '~>0.2' + s.dependency 'Moya', '~> 13.0' + s.dependency 'RxSwift', '~> 6.1.0' + s.dependency 'RxSwiftExtensions.swift', '~> 0.2' end From 440d4fc4024ca8ade81e5968c64a226ea7d039ee Mon Sep 17 00:00:00 2001 From: ash Date: Thu, 25 Feb 2021 20:25:18 +0800 Subject: [PATCH 15/17] Update Network.swift.podspec --- Network.swift.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Network.swift.podspec b/Network.swift.podspec index a481c4a..dd47e52 100644 --- a/Network.swift.podspec +++ b/Network.swift.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = 'Network.swift' - s.version = '0.8.6' + s.version = '0.8.7' s.summary = 'Moya+RxSwift 扩展' s.description = <<-DESC From 8fe9f78589816b3256027df7b2fc4298f87301b4 Mon Sep 17 00:00:00 2001 From: ash Date: Thu, 25 Feb 2021 20:30:24 +0800 Subject: [PATCH 16/17] 123 --- .gitignore | 2 +- Example/Podfile.lock | 18 +++++++++--------- Example/RHNetwork.xcodeproj/project.pbxproj | 4 ---- .../contents.xcworkspacedata | 10 ++++++++++ Network.swift.podspec | 2 +- 5 files changed, 21 insertions(+), 15 deletions(-) create mode 100644 Example/RHNetwork.xcworkspace/contents.xcworkspacedata diff --git a/.gitignore b/.gitignore index 93c86d3..d16aced 100644 --- a/.gitignore +++ b/.gitignore @@ -34,4 +34,4 @@ Carthage/Build # Note: if you ignore the Pods directory, make sure to uncomment # `pod install` in .travis.yml # -# Pods/ +Example/Pods/ diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 4c0b94b..1f9d325 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,16 +1,16 @@ PODS: - - Alamofire (4.9.0) + - Alamofire (4.9.1) - Moya (13.0.1): - Moya/Core (= 13.0.1) - Moya/Core (13.0.1): - Alamofire (~> 4.1) - Result (~> 4.1) - - Network.swift (0.8.5): + - Network.swift (0.8.7): - Moya (~> 13.0) - - RxSwift (~> 5.0) + - RxSwift - RxSwiftExtensions.swift (~> 0.2) - Result (4.1.0) - - RxSwift (5.0.0) + - RxSwift (5.1.1) - RxSwiftExtensions.swift (0.2.5): - RxSwift (~> 5.0) @@ -18,7 +18,7 @@ DEPENDENCIES: - Network.swift (from `../`) SPEC REPOS: - https://github.com/cocoapods/specs.git: + trunk: - Alamofire - Moya - Result @@ -30,13 +30,13 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - Alamofire: afc3e7c6db61476cb45cdd23fed06bad03bbc321 + Alamofire: 85e8a02c69d6020a0d734f6054870d7ecb75cf18 Moya: f4a4b80ff2f8a4ffc208dfb31cd91636622fee6e - Network.swift: 7ffbab5d4fb4c833f2b0a02700a447abb90115a5 + Network.swift: 39f867d898b4e5b6bc9c3c93c668b15832561b5d Result: bd966fac789cc6c1563440b348ab2598cc24d5c7 - RxSwift: 8b0671caa829a763bbce7271095859121cbd895f + RxSwift: 81470a2074fa8780320ea5fe4102807cb7118178 RxSwiftExtensions.swift: 2e288839301728e5de4de06bf143359ed75198c3 PODFILE CHECKSUM: 6ab97ae7f336ec2ae0d893569e6b4fdd4ecad3fc -COCOAPODS: 1.6.2 +COCOAPODS: 1.10.1 diff --git a/Example/RHNetwork.xcodeproj/project.pbxproj b/Example/RHNetwork.xcodeproj/project.pbxproj index b53bcc0..5f45dcc 100644 --- a/Example/RHNetwork.xcodeproj/project.pbxproj +++ b/Example/RHNetwork.xcodeproj/project.pbxproj @@ -266,8 +266,6 @@ buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-RHNetwork_Example/Pods-RHNetwork_Example-frameworks.sh", "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", @@ -278,8 +276,6 @@ "${BUILT_PRODUCTS_DIR}/RxSwiftExtensions.swift/RxSwiftExtensions.framework", ); name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - ); outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework", diff --git a/Example/RHNetwork.xcworkspace/contents.xcworkspacedata b/Example/RHNetwork.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9c21fec --- /dev/null +++ b/Example/RHNetwork.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Network.swift.podspec b/Network.swift.podspec index dd47e52..2370c70 100644 --- a/Network.swift.podspec +++ b/Network.swift.podspec @@ -31,7 +31,7 @@ Pod::Spec.new do |s| s.source_files = 'Network/Classes/**/*.swift' s.dependency 'Moya', '~> 13.0' - s.dependency 'RxSwift', '~> 6.1.0' + s.dependency 'RxSwift' s.dependency 'RxSwiftExtensions.swift', '~> 0.2' end From 7ab491c299bcd409fd9aed4bf9de9008e4552b19 Mon Sep 17 00:00:00 2001 From: ash Date: Thu, 25 Feb 2021 20:33:31 +0800 Subject: [PATCH 17/17] Update Network.swift.podspec --- Network.swift.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Network.swift.podspec b/Network.swift.podspec index 2370c70..6e01317 100644 --- a/Network.swift.podspec +++ b/Network.swift.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = 'Network.swift' - s.version = '0.8.7' + s.version = '0.8.5' s.summary = 'Moya+RxSwift 扩展' s.description = <<-DESC