我没有将网络模型加载到每个 Controller 中,而是试图将其抽象到一个 Controller 中 ModelLoader
这是我到目前为止的想法:
protocol ModelLoaderDelegate: class {
func didFetch(model: Any)
func modelFailedToFetch(errorMessage: String)
}
final class ModelLoader<ModelType> {
let api: API
weak var delegate: ModelLoaderDelegate?
private let client = dependencies.client
init(api: API) {
self.api = api
}
func fetchModel() {
client.performRequest(api: api, decodeTo: ModelType.self, completion: { result in
switch result {
case .success(let value):
self.delegate?.didFetch(model: value)
case .failure(let error):
self.delegate?.modelFailedToFetch(errorMessage: error.localizedDescription)
}
})
}
}
到目前为止,我无法做的一件事是将 ModelLoaderDelegate
的 didFetch
方法中的 Any
替换为类泛型参数。
我试着这样做:
func didFetch<T>(info: T)
但是在委托(delegate)的实现者中:
func didFetch<T>(info: T) {
// I need a concerete type here not a generic
}
找不到其他方法。
最佳答案
您可以通过闭包制作逻辑,而不是通过委托(delegate)来完成此操作:
final class ModelLoader<ModelType> {
let api: API
private let client = dependencies.client
init(api: API) {
self.api = api
}
func fetchModel<ModelType>(completion: @escaping (Result<ModelType, Error>) -> ()) {
client.performRequest(api: api, decodeTo: ModelType.self, completion: { result in
switch result {
case .success(let value):
completion(.success(value))
case .failure(let error):
completion(.failure(error))
}
})
}
}
我认为使用这种方法会更容易处理响应:)
关于ios - 如何抽象网络模型获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57653873/