使用RxSwift中的map,对于在搜索栏中插入的每个字符,我都会调用一个API以获取json并将数据解析为表格视图。但是由于我只是为了演示目的而更改了插入恒定API中的每个字符,所以出现了此错误
在以下行失败:let model: T = try JSONDecoder().decode(T.self, from: data ?? Data())
请帮助我,非常感谢
绑定错误:typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[],debugDescription:“预期对Array进行解码,但找到了一个字典。”,底层错误:无))
This's my codable struct for mapping with json given below
struct Result: Codable {
let shopName: String
let shopImage: String
let maintenanceDate: String
let maintenanceContent: String
let shopDetailUrl: String
private enum CodingKeys: String, CodingKey {
case shopName = "shop_name"
case shopImage = "shop_image"
case maintenanceDate = "maintenance_date"
case maintenanceContent = "maintenance_content"
case shopDetailUrl = "shop_detail_url"
}
}
struct ShopModel: Codable {
let status: Bool
let code: Int
let message: String?
let result: Result
private enum CodingKeys: String, CodingKey {
case status
case code
case message
case result = "result"
}
}
{
"status": true,
"code": 200,
"message": null,
"result": {
"shop_name": "AAAAAA",
"shop_image": "https://......",
"maintenance_date": "",
"maintenance_content": "",
"shop_detail_url": "/store/detail/111113/42"
}
}
This is where events triggered to call api everytime a character inserted in searchbar
private func configureReactiveBinding() {
searchController.searchBar.rx.text.asObservable()
.map { _ in CarRequest(token: "6aa86866d95414a9e469f4323b1da139f96d22d8") }
.flatMap { request -> Observable<[ShopModel]> in
return self.apiClient.send(apiRequest: request)
}
.bind(to: tableView.rx.items(cellIdentifier: cellIdentifier)) { index, model, cell in
cell.textLabel?.text = model.result.shopImage
cell.detailTextLabel?.text = model.result.shopName
cell.textLabel?.adjustsFontSizeToFitWidth = true
}
.disposed(by: disposeBag)
}
}
send api request, and decode json
private let baseURL = URL(string: "https://stg.api.link-collabo.jp/api/user/myshop.json")!
func send<T: Codable>(apiRequest: APIRequest) -> Observable<T> {
return Observable<T>.create { [unowned self] observer in
let request = apiRequest.request(with: self.baseURL)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
do {
let model: T = try JSONDecoder().decode(T.self, from: data ?? Data())
print(model)
observer.onNext(model)
} catch let error {
observer.onError(error)
}
observer.onCompleted()
}
task.resume()
return Disposables.create {
task.cancel()
}
}
}