我创建了一个网络管理器,我在其中发送请求并获得成功结果,如下所示:
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 函数,我可以将它与枚举和不同的响应类型一起使用,这样我就可以在每个模块中使用它。
我能做些什么来实现这一目标?谢谢。