Добрый вечер, пытаюсь разобраться с дженериками и как-то начать их более менее юзать!
В общем, поставил себе боевую задачу, ниже класс сервиса для запросов, с одной функцией, у которой ы сигнатуре route - енум из параметров которого собирается request и completition, в общем тут все понятно
Необращайте внимание пока на обработку ошибок в ответе, это к месту пока не относится, допишу)))
public class ApiService<Router: ApiRoutable>: NetworkRouter {
private var task: URLSessionTask?
func request<T: Decodable>(_ route: Router, completition: @escaping (T?, Error?) -> ()) {
let session = URLSession.shared
do {
let request = try route.asURLRequest()
task = session.dataTask(with: request, completionHandler: {
(data, response, error) in
do {
let model = try JSONDecoder().decode(Response<T>.self, from: data!)
completition(model.data, nil)
} catch {
RouterLogger.error("ApiService", "request", "\(String(describing: T.self)) Error decode", error: error)
}
})
} catch {
RouterLogger.error("ApiService", "request", "request", error: error)
}
task?.resume()
}
func cancel() {
task?.cancel()
}
}
Дальше я хочу сделать реактивное расширение под запросы, Вопрос
можно ли это как-то сделать дженериком, долго мучайся, но скорее всего тупенький, и с расширением ничего особо не получилось, поэтому просто сделал ф-ю возвращающую обсервабл
extension ApiService {
func getObserver(route: Router) -> Observable<[OrderModel]> {
return Observable.create({
(observer) -> Disposable in
self.request(route, completition: {
(a, error) in
observer.onNext(a!)
})
return Disposables.create()
})
}
}
И так вопрос, в какой момент модель ответа a кастится к [OrderModel]
В момент когда я оннекстом посылаю Decodable?!
Это вообще жизнеспособный способ работы с сетью!?
И можно-ли как-то сделать универсальный метод, в который указывать тип, он будет возвращать нужную модель от декодубла!??!