今日は ReactiveSwift と APIKit を組み合わせてみます。
いきなりですが以下のようなコードになります。
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>