Created
March 10, 2016 15:41
-
-
Save robertofrontado/475787b538d3d4c9f90d to your computer and use it in GitHub Desktop.
Returning Observable from request on a background thread
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import RxSwift | |
/// Subclass of MoyaProvider that returns Observable instances when requests are made. Much better than using completion closures. | |
public class RxMoyaProvider<Target where Target: TargetType>: MoyaProvider<Target> { | |
/// Initializes a reactive provider. | |
override public init(endpointClosure: EndpointClosure = MoyaProvider.DefaultEndpointMapping, | |
requestClosure: RequestClosure = MoyaProvider.DefaultRequestMapping, | |
stubClosure: StubClosure = MoyaProvider.NeverStub, | |
manager: Manager = RxMoyaProvider<Target>.DefaultAlamofireManager(), | |
plugins: [PluginType] = []) { | |
super.init(endpointClosure: endpointClosure, requestClosure: requestClosure, stubClosure: stubClosure, manager: manager, plugins: plugins) | |
} | |
/// Designated request-making method. | |
public func request(token: Target) -> Observable<Response> { | |
// Creates an observable that starts a request each time it's subscribed to. | |
return Observable.create { [weak self] observer in | |
let cancellableToken = self?.request(token) { result in | |
switch result { | |
case let .Success(response): | |
observer.onNext(response) | |
observer.onCompleted() | |
break | |
case let .Failure(error): | |
observer.onError(error) | |
} | |
} | |
return AnonymousDisposable { | |
cancellableToken?.cancel() | |
} | |
}.observeOn(SerialDispatchQueueScheduler(globalConcurrentQueueQOS: .Background)) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Swift 4 version: