tôi quản lý để serialize phản ứng dữ liệu với các đối tượng codable.
Vì tất cả các bạn có thể đã quen thuộc với việc chuyển đổi đối tượng json [String: String]
chẳng hạn. Đối tượng json đó cần phải được chuyển đổi thành Data
bằng cách sử dụng json.data(using: .utf8)!
.
Với Alamofire, nó rất dễ dàng để có được dữ liệu (hoặc ít nhất là loại dữ liệu này làm việc cho tôi, đã tương thích với .utf8
điều), tôi chỉ có thể sử dụng chức năng đã có sẵn này
func responseData(queue: DispatchQueue?, completionHandler: @escaping (DataResponse<Data>) -> Void) -> Self
Sau đó chỉ cần sử dụng dữ liệu đó như là đầu vào cho Decoder
trong completionHandler
let objek = try JSONDecoder().decode(T.self, from: data)
Bạn cũng có thể làm điều này với một số chức năng serialization chung chung, với một tinh chỉnh nhỏ, từ các tài liệu
Generic Response Object Serialization
để sửa đổi này
func responseCodable<T: Codable>(
queue: DispatchQueue? = nil,
completionHandler: @escaping (DataResponse<T>) -> Void)
-> Self
{
let responseSerializer = DataResponseSerializer<T> { request, response, data, error in
guard error == nil else { return .failure(BackendError.network(error: error!)) }
guard let data = data else {
return .failure(BackendError.objectSerialization(reason: "data is not valid"))
}
do{
let objek = try JSONDecoder().decode(T.self, from: data!)
return .success(objek)
} catch let e {
return .failure(BackendError.codableSerialization(error: e))
}
}
return response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler)
}
mẫu struct
struct Fids: Codable {
var Status: Status?
var Airport: Airport?
var Record: [FidsRecord]
}
Sử dụng chức năng theo cách này
Alamofire.request("http://whatever.com/zzz").responseCodable { (response: DataResponse<Fids>) in
switch response.result{
case .success(let value):
print(value.Airport)
// MARK: do whatever you want
case .failure(let error):
print(error)
self.showToast(message: error.localizedDescription)
}
}
là câu hỏi của bạn như thế nào để chuyển đổi JSON bạn cung cấp vào một mảng of Person (thực thể ví dụ)? Hoặc một mảng của các đối tượng không đồng nhất? – nathan
Vâng, tôi biết nếu tôi có '{" firstname ":" Tom "," lastname ":" Smith "," age ": 31}' và một lớp người tôi có thể chuyển đổi JSON thành đối tượng người trong Swift bằng cách sử dụng mã hoá . Nhưng tôi không chắc làm thế nào tôi có thể làm điều đó nếu tôi có mảng JSON mà tôi nhận được từ Alamofire. –
Tôi không thực sự quen thuộc với Alamofire (hoặc với thư viện này), nhưng có https://github.com/Otbivnoe/CodableAlamofire –