From 2ff0057f1230c33b60bc852fad2b89a0ce7da106 Mon Sep 17 00:00:00 2001 From: Alexey Gerasimov Date: Thu, 27 Apr 2017 15:39:43 +0300 Subject: [PATCH] Error handling basic support --- .../project.pbxproj | 4 ++++ .../Enums/ApiErrorProtocol.swift | 23 +++++++++++++++++++ .../Extensions/Observable+Extensions.swift | 23 +++++++++++++++++++ .../Network/DefaultNetworkService.swift | 17 -------------- 4 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 LeadKitAdditions/LeadKitAdditions/Enums/ApiErrorProtocol.swift diff --git a/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.pbxproj b/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.pbxproj index 9963a0d..ef8b0fc 100644 --- a/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.pbxproj +++ b/LeadKitAdditions/LeadKitAdditions.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@ EF05EDFC1EB0D77400CAE7B6 /* DefaultNetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF05EDFA1EB0D77400CAE7B6 /* DefaultNetworkService.swift */; }; EF05EDFD1EB0D77400CAE7B6 /* ApiNetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF05EDFB1EB0D77400CAE7B6 /* ApiNetworkService.swift */; }; EF05EE021EB206C000CAE7B6 /* LoadingBarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF05EE011EB206C000CAE7B6 /* LoadingBarButton.swift */; }; + EF05EE041EB21A2D00CAE7B6 /* ApiErrorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF05EE031EB21A2D00CAE7B6 /* ApiErrorProtocol.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -58,6 +59,7 @@ EF05EDFA1EB0D77400CAE7B6 /* DefaultNetworkService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultNetworkService.swift; sourceTree = ""; }; EF05EDFB1EB0D77400CAE7B6 /* ApiNetworkService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiNetworkService.swift; sourceTree = ""; }; EF05EE011EB206C000CAE7B6 /* LoadingBarButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadingBarButton.swift; sourceTree = ""; }; + EF05EE031EB21A2D00CAE7B6 /* ApiErrorProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiErrorProtocol.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -147,6 +149,7 @@ isa = PBXGroup; children = ( EF05EDB91EAF705500CAE7B6 /* ApiError.swift */, + EF05EE031EB21A2D00CAE7B6 /* ApiErrorProtocol.swift */, EF05EDBA1EAF705500CAE7B6 /* ConnectionError.swift */, ); path = Enums; @@ -361,6 +364,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + EF05EE041EB21A2D00CAE7B6 /* ApiErrorProtocol.swift in Sources */, EF05EDB81EAF704800CAE7B6 /* UserDefaults+UserService.swift in Sources */, EF05EDE11EAFA74200CAE7B6 /* BasePassCodeViewController.swift in Sources */, EF05EDC61EAF70EB00CAE7B6 /* TouchIDService.swift in Sources */, diff --git a/LeadKitAdditions/LeadKitAdditions/Enums/ApiErrorProtocol.swift b/LeadKitAdditions/LeadKitAdditions/Enums/ApiErrorProtocol.swift new file mode 100644 index 0000000..3f7d8c9 --- /dev/null +++ b/LeadKitAdditions/LeadKitAdditions/Enums/ApiErrorProtocol.swift @@ -0,0 +1,23 @@ +// +// ApiErrorProtocol.swift +// LeadKitAdditions +// +// Created by Alexey Gerasimov on 27/04/2017. +// Copyright © 2017 TouchInstinct. All rights reserved. +// + +public protocol ApiErrorProtocol: RawRepresentable {} + +extension Error { + + public func isApiError(_ apiErrorType: T) -> Bool where T.RawValue == Int { + if let error = self as? ApiError, + case let .error(code: code, message: _) = error, + code == apiErrorType.rawValue { + return true + } else { + return false + } + } + +} diff --git a/LeadKitAdditions/LeadKitAdditions/Extensions/Observable+Extensions.swift b/LeadKitAdditions/LeadKitAdditions/Extensions/Observable+Extensions.swift index 3aa0e7a..4a9eec8 100644 --- a/LeadKitAdditions/LeadKitAdditions/Extensions/Observable+Extensions.swift +++ b/LeadKitAdditions/LeadKitAdditions/Extensions/Observable+Extensions.swift @@ -66,4 +66,27 @@ public extension Observable { } } + public func handleApiError(_ apiErrorType: T, + handler: @escaping () -> Void) -> Observable + where T.RawValue == Int { + + return observeOn(CurrentThreadScheduler.instance) + .do(onError: { error in + if error.isApiError(apiErrorType) { + handler() + } + }) + } + + public func changeLoadingBehaviour(isLoading: PublishSubject) -> Observable { + return observeOn(CurrentThreadScheduler.instance) + .do(onNext: { _ in + isLoading.onNext(false) + }, onError: { _ in + isLoading.onNext(false) + }, onSubscribe: { _ in + isLoading.onNext(true) + }) + } + } diff --git a/LeadKitAdditions/LeadKitAdditions/Services/Network/DefaultNetworkService.swift b/LeadKitAdditions/LeadKitAdditions/Services/Network/DefaultNetworkService.swift index 4daa92d..a728d15 100644 --- a/LeadKitAdditions/LeadKitAdditions/Services/Network/DefaultNetworkService.swift +++ b/LeadKitAdditions/LeadKitAdditions/Services/Network/DefaultNetworkService.swift @@ -64,21 +64,4 @@ open class DefaultNetworkService: NetworkService { return sessionManager } - public static func apiRequestParameters(url: String, parameters: [String: Any] = [:]) -> ApiRequestParameters { - return ApiRequestParameters(baseUrl: baseUrl, url: url, parameters: parameters) - } - -} - -private extension ApiRequestParameters { - - init(baseUrl: String, url: String, parameters: [String: Any] = [:]) { - - self.init(url: baseUrl + url, - method: .post, - parameters: parameters, - encoding: JSONEncoding.default, - headers: nil) - } - }