我正在嘗試序列化一些來自 API 端點的 JSON 資料,并且因為所有端點都具有相同的結構,我認為最好實作一些不需要在代碼中再次重復的內容.
JSON 回應 1:
{
"code":1100,
"message":"Successfully created application",
"data":{
"key":116541
}
}
JSON 回應 2:
{
"code":1101,
"message":"Successfully retrived",
"data":{
"id":116541,
"name":"hallow"
}
}
僅資料更改取決于 API 端點。他們總是會以這種結構出現。
struct RawResponse<T: Decodable>: Decodable {
let code: Int
let message: String
let data: T
}
這是我不知道如何使用來自 Alamofire 的 DecodableResponseSerializer 解碼 RawResponse 的地方。
final class CustomDecodeableResponseSerializer<T: Decodable>: ResponseSerializer {
//...decoder setup
//don't work, missing "T" because it's defined in the struct don't know where to add this
private lazy var successSerializer = DecodableResponseSerializer<RawResponse>(decoder: decoder)
//This works as it's just pure struct without generic
private lazy var errorSerializer = DecodableResponseSerializer<APIError>(decoder: decoder)
//...public func serialize stuff
}
這是行不通的,因為它要求在結構中定義“T”,而“T”是通過 DataRequest 的擴展傳入的
@discardableResult
func responseCustom<T: Decodable>(queue: DispatchQueue = DispatchQueue.global(qos: .userInitiated), of t: T.Type, completionHandler: @escaping (Result<T, APIError>) -> Void) -> Self {
return response(queue: .main, responseSerializer: CustomDecodeableResponseSerializer<T>()) { response in
switch response.result {
case .success(let result):
completionHandler(result)
case .failure(let error):
completionHandler(.failure(APIError(code: -1, message: error.localizedDescription)))
}
}
}
所以它可以這樣呼叫:用戶是另一個要解碼為 JSON“資料”欄位的結構
session.request()
.validate()
.responseCustom(of: User.self){(response) in
//do stuff
}
我希望這是有道理的......我知道如果我只是傳遞 T 而不是創建原始回應結構,我可以在每個回應結構中重復代碼和訊息,它會起作用。但我希望不要在每個回應結構中重復代碼和訊息。或者有沒有更簡單的方法來實作這一目標?
uj5u.com熱心網友回復:
您的代碼中沒有它,但請確保您CustomDecodeableResponseSerializer
正在RawResponse<T>
從其serialize
方法中回傳。然后您可以確保成功案例的解碼器是`DecodableResponseSerializer<RawResponse>(解碼器:解碼器)。
此外,沒有理由使用DispatchQueue.global()
. 該引數僅控制呼叫完成處理程式的位置,實際的序列化作業始終在后臺執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/388214.html
上一篇:為什么這個函式可以確定Swift中整數的輸入是奇數還是偶數?
下一篇:使鏈表符合集合協議