首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何抽象网络模型获取

如何抽象网络模型获取
EN

Stack Overflow用户
提问于 2019-08-26 15:56:27
回答 1查看 57关注 0票数 0

我尝试将网络模型加载到每个控制器中,而不是将其抽象到一个控制器ModelLoader

这是我到目前为止想出来的:

代码语言:javascript
复制
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)
            }
        })
    }
}

到目前为止,我还不能做的一件事是将ModelLoaderDelegatedidFetch方法中的Any替换为类似泛型的参数。

我试着这样做:

代码语言:javascript
复制
func didFetch<T>(info: T)

但是在委托的实现者中:

代码语言:javascript
复制
func didFetch<T>(info: T) {
 // I need a concerete type here not a generic
}

找不到其他方法。

EN

回答 1

Stack Overflow用户

发布于 2019-08-26 16:14:24

取而代之的是通过委托来实现,你可以通过闭包来创建逻辑:

代码语言:javascript
复制
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))
            }
        })
    }
}

我认为使用这种方法将更容易处理响应:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57653873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档