Skip to content

Instantly share code, notes, and snippets.

@pofat
Created May 22, 2019 13:57
Show Gist options
  • Save pofat/a21f848521a17484d0061262762ca7a9 to your computer and use it in GitHub Desktop.
Save pofat/a21f848521a17484d0061262762ca7a9 to your computer and use it in GitHub Desktop.
import Foundation
import RxSwift
// MARK: Model
struct User: Decodable {
let id: Int
let name: String
}
let usersDecode: (Data) -> [User]? = { data in
return try? JSONDecoder().decode([User].self, from: data)
}
// MARK: Request related
enum HTTPMethod: String {
case GET
case POST
}
struct Request<Response: Decodable> {
var endpoint: String
var method: HTTPMethod
var param: [String: Any]?
let decode: (Data) -> Response?
}
struct RequestSender {
let base = "https://foo.bar"
private let sendingRequst: (URLRequest) -> Observable<Data> // To abstract your network framework
init(_ sendingRequst: @escaping(URLRequest) -> Observable<Data>) {
self.sendingRequst = sendingRequst
}
func send<Response: Decodable>(_ r: Request<Response>) -> Observable<Response?> {
let url = URL(string: base + r.endpoint)!
var request = URLRequest(url: url)
request.httpMethod = r.method.rawValue
if let param = r.param, let body = try? JSONSerialization.data(withJSONObject: param, options: .prettyPrinted) {
request.httpBody = body
}
return sendingRequst(request).map(r.decode)
}
}
// MARK: Main
// Instance of requests and request sender
let getUsersRequest = Request(endpoint: "/users", method: .GET, param: nil, decode: usersDecode)
// You can use any other network framework such as Alamofire
let urlSessionRequestSender = RequestSender { request in
return Observable<Data>.create { subscriber in
let task = URLSession.shared.dataTask(with: request) { data, res, error in
if let data = data {
subscriber.onNext(data)
} else {
subscriber.onError(error!)
}
}
task.resume()
return Disposables.create()
}
}
// Actually do request (get users)
_ = urlSessionRequestSender.send(getUsersRequest).subscribe(onNext: { users in
guard let users = users else {
return
}
print(users)
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment