Skip to content

Instantly share code, notes, and snippets.

@torpedo87
Created January 22, 2019 06:55
Show Gist options
  • Save torpedo87/a876896917b0f8ce92b34a150a1e2479 to your computer and use it in GitHub Desktop.
Save torpedo87/a876896917b0f8ce92b34a150a1e2479 to your computer and use it in GitHub Desktop.
custom Reactive extension

custom reactive extension

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()
    })
  }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment