extension Reactive where Base: URLSession {
//response
func response(request: URLRequest) -> Observable<(HTTPURLResponse, Data)> {
return Observable.create({ observer in
let task = self.base.dataTask(with: request, completionHandler: { (data, response, error) in
guard let response = response, let data = data else {
observer.onError(error ?? RxURLSessionError.unknown)
return
}
guard let httpResponse = response as? HTTPURLResponse else {
observer.onError(RxURLSessionError.invalidResponse(response: response))
return
}
observer.onNext((httpResponse, data))
observer.onCompleted()
})
task.resume()
return Disposables.create(with: task.cancel)
})
}
func data(request: URLRequest) -> Observable<Data> {
return response(request: request).map({ (response, data) in
if 200..<300 ~= response.statusCode {
return data
} else {
throw RxURLSessionError.requestFailed(response: response, data: data)
}
})
}
func string(request: URLRequest) -> Observable<String> {
return data(request: request).map({ d in
return String(data: d, encoding: .utf8) ?? ""
})
}
func json(request: URLRequest) -> Observable<JSON> {
return data(request: request).map({ d in
return try JSON(data: d)
})
}
func image(request: URLRequest) -> Observable<UIImage> {
return data(request: request).map({ d in
return UIImage(data: d) ?? UIImage()
})
}
}
Created
January 22, 2019 06:55
-
-
Save torpedo87/a876896917b0f8ce92b34a150a1e2479 to your computer and use it in GitHub Desktop.
custom Reactive extension
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment