1

我创建了一个网络管理器,我在其中发送请求并获得成功结果,如下所示:

func request<T: Decodable>(url: ServiceURL,
                           method: HTTPMethod,
                           parameters: Parameters?,
                           encoding: ParameterEncoding,
                           responseObjectType: T.Type,
                           success: @escaping (T) -> Void,
                           failure: @escaping (AFError) -> Void) {
    let requestURL = StaticStringsList.baseURL + url.description + StaticStringsList.apiKeyParam
    let request = AF.request(
        requestURL,
        method: method,
        parameters: parameters,
        encoding: encoding,
        headers: nil
    )
    request
        .validate()
        .responseDecodable(of: T.self) { response in
            switch response.result {
            case .success(let data):
                success(data)
            case .failure(let error):
                failure(error)
            }
        }
}

后来我在我的 viewModel 中使用它,到目前为止效果很好。

private func movieDetailAPIHandler() {
    NetworkManager.shared.request(
        url: .movieDetail(model.id.string()),
        method: .get,
        parameters: nil,
        encoding: URLEncoding.default,
        responseObjectType: MovieDetailResponse.self,
        success: { [weak self] result in
            self?.movieDetailResult = result
        },
        failure: { error in
            print("error in tvdetail \(error)")
        }
    )
}

我想要做的是,摆脱 viewModel 中调用的函数。(例如:上面的 movieDetailAPIHandler()。)

我的意思是,创建一个 APIHandler 类,我在其中调用 NetworkManager 的请求函数,并在那里处理每种响应类型。

下面的 APIHandlers 类是我想要做的。我还创建了一个名为 ServiceURL 的枚举,它根据 apiHandler() 函数的输入带来相关的 url,如下所示:

class APIHandlers {
static let shared = APIHandlers()

func apiHandler<T: Codable>(with idServiceURL: ServiceURL, type: T, success: @escaping ((T) -> Void)) {
    NetworkManager.shared.request(
        url: idServiceURL,
        method: .get,
        parameters: nil,
        encoding: URLEncoding.default,
        responseObjectType: T.self,
        success: success,
        failure: { _ in
            print("cast alınamadı")
        }
    )
}

到目前为止一切看起来都不错,但是当我尝试调用 apiHandler() 函数时,编译器给我错误消息“类型'CastResponse.Type'不能符合'Decodable'”除此之外,xcode 不知道我的请求类型是什么。 (查看下图。)

我的 viewModel 中的 APIHandler 函数:

APIHandlers.shared.apiHandler(with: .movieCast(model.id.string()), type: CastResponse) { response in

    }

所以我尝试做一个通用的 apiHandler 函数,我可以将它与枚举和不同的响应类型一起使用,这样我就可以在每个模块中使用它。

我能做些什么来实现这一目标?谢谢。

截图

4

0 回答 0