ReactiveSwift と APIKit を組み合わせる

今日は ReactiveSwiftAPIKit を組み合わせてみます。

いきなりですが以下のようなコードになります。

extension Session: ReactiveExtensionsProvider { }

extension Reactive where Base: Session {
    
    func send<Request>(_ request: Request) -> SignalProducer<Request.Response, SessionTaskError> where Request: APIKit.Request {
        return SignalProducer { [weak base] observer, lifetime in
            guard let session = base else {
                observer.sendInterrupted()
                return
            }
            
            let task = session.send(request) { result in
                switch result {
                case .success(let response):
                    observer.send(value: response)
                    observer.sendCompleted()
                case .failure(let sessionTaskError):
                    observer.send(error: sessionTaskError)
                }
            }
            
            lifetime.observeEnded {
                task?.cancel()
            }
        }
    }
}

let request = AppRequest(name: "おとなのおこづかい帳")
Session.shared.reactive.send(request).startWithResult { result in
    switch result {
    case .success(let app):
        print(app.review == "★★★★★")
    case .failure(let sessionTaskError):
        print(sessionTaskError)
    }
}

RxSwift 版を参考にしました。

ReactiveSwift にはエラーの型が指定できるので RxSwift とくらべてエラーハンドリングしやすそうですね。

// RxSwift
func send<Request>(_ request: Request) -> Observable<Request.Response>

// ReactiveSwift
func send<Request>(_ request: Request) -> SignalProducer<Request.Response, SessionTaskError>