Skip to content

Instantly share code, notes, and snippets.

@robertofrontado
Created March 10, 2016 15:41
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robertofrontado/475787b538d3d4c9f90d to your computer and use it in GitHub Desktop.
Save robertofrontado/475787b538d3d4c9f90d to your computer and use it in GitHub Desktop.
Returning Observable from request on a background thread
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))
}
}
@jugutier
Copy link

Swift 4 version:

public class RxMoyaProvider<Target>: MoyaProvider<Target> where Target: TargetType {
    //No need for initializer, use superclass directly


    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 Disposables.create() {
                cancellableToken?.cancel()
            }
            }.observeOn(SerialDispatchQueueScheduler(qos: .background))
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment