Created
May 22, 2019 13:57
-
-
Save pofat/a21f848521a17484d0061262762ca7a9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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