Skip to content

Commit

Permalink
updated combine error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
mmitrevs committed Sep 30, 2020
1 parent ef0ead5 commit be73068
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 4 deletions.
4 changes: 2 additions & 2 deletions GirdersSwift.podspec
@@ -1,12 +1,12 @@
Pod::Spec.new do |s|
s.name = 'GirdersSwift'
s.version = '0.5.3'
s.version = '0.5.4'
s.summary = 'Girders for iOS, written in Swift.'
s.homepage = 'http://www.netcetera.com'
s.author = 'Netcetera'
s.description = 'A library that reduces development time for iOS Swift applications.'
s.platform = :ios, '9.0'
s.source = { :git => 'https://github.com/netceteragroup/GirdersSwift.git', :tag => '0.5.3' }
s.source = { :git => 'https://github.com/netceteragroup/GirdersSwift.git', :tag => '0.5.4' }
s.requires_arc = true
s.swift_version = "5.0"
s.module_name = 'GirdersSwift'
Expand Down
3 changes: 3 additions & 0 deletions GirdersSwift/src/main/swift/http/HTTP.swift
Expand Up @@ -84,6 +84,9 @@ public protocol HTTP {
@available(iOS 13, *)
func executeRequest<T>(request: Request) -> AnyPublisher<T, Error> where T: Decodable

@available(iOS 13, *)
func executeDataRequest(request: Request) -> AnyPublisher<Data, Error>

/// Executes the request with the provided url, returning a Combine future.
///
/// - Parameter request: The request object containing all required data.
Expand Down
58 changes: 56 additions & 2 deletions GirdersSwift/src/main/swift/http/HTTPClient.swift
Expand Up @@ -162,8 +162,29 @@ extension HTTPClient {
.mapError({ (error) -> Error in
ResponseError<URLError>.error(from: error)
})
.flatMap(maxPublishers: .max(1)) { [unowned self] pair in
self.decode(pair.data)
.flatMap(maxPublishers: .max(1)) { [unowned self] pair -> AnyPublisher<T, Error> in
guard let httpResponse = pair.response as? HTTPURLResponse else {
return Future { promise in
promise(.failure(NSError.unknown))
}
.eraseToAnyPublisher()
}

if httpResponse.statusCode / 100 == 2 {
return self.decode(pair.data)
}

let response = Response<T>(statusCode: httpResponse.statusCode,
body: pair.data,
bodyObject: nil,
responseHeaders: httpResponse.allHeaderFields,
url: httpResponse.url)

let responseError = ResponseError<T>.error(fromResponse: response)
return Future { promise in
promise(.failure(responseError))
}
.eraseToAnyPublisher()
}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
Expand All @@ -179,6 +200,31 @@ extension HTTPClient {
return publisher
}

@available(iOS 13, *)
public func executeDataRequest(request: Request) -> AnyPublisher<Data, Error> {
let urlRequest: URLRequest = URLRequest(request: request)
requestsPool.append(request)
let publisher: AnyPublisher<Data, Error> = urlSession.dataTaskPublisher(for: urlRequest)
.mapError({ (error) -> Error in
ResponseError<URLError>.error(from: error)
})
.flatMap(maxPublishers: .max(1), { pair in
return self.dataPublisher(pair.data)
})
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()

let cancelable = publisher.sink(receiveCompletion: { [weak self] (completion) in
self?.removeFromPool(request: request)
}) { (value) in
Log.debug("Received value for request with url: \(request.url.absoluteString)")
}

cancelables.append(cancelable)

return publisher
}

@available (iOS 13, *)
public func executeRequest<T>(request: Request) -> Future<T, Error> where T: Decodable {
return Future<T, Error> { [unowned self] promise in
Expand Down Expand Up @@ -224,6 +270,14 @@ extension HTTPClient {
.eraseToAnyPublisher()
}

@available(iOS 13, *)
private func dataPublisher(_ data: Data) -> AnyPublisher<Data, Error> {
return Future { promise in
return promise(.success(data))
}
.eraseToAnyPublisher()
}

}
#endif

Expand Down

0 comments on commit be73068

Please sign in to comment.