#ios #json #swift #rest #alamofire
#iOS #json #swift #остальное #alamofire
Вопрос:
Я пытаюсь отобразить некоторые данные json внутри моей ячейки TableView и проанализировал данные json.
Но
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.contents.count
}
возврат 0
и в результате я не могу отобразить данные внутри UITableViewCell
события, хотя все мои JSON
данные были проанализированы и готовы к отображению … как это исправить?
мой класс модели ответа и остальная часть реализации выглядят следующим образом:
- Классы модели для
json
ответа
// MARK: - TradingPairElement
class TradingPair: Entity {
var id: Int?
//var name: String?
var quoteAsset: QuoteAsset?
}
enum QuoteAsset: String, Codable {
case btc = "BTC"
case krw = "KRW"
}
// MARK: - TickerByPair
class TickerByPair: Entity {
var ask: Int?
//var price: Double?
//var volume: Double?
var askVolume: Double?
var bid: Int?
var bidVolume: Double?
var time: String?
}
И оболочку class
для содержимого двух вышеупомянутых class
:
class Entity: Codable {
var name: String?
var price: Double?
var volume: Double?
}
и вот как я получаю данные из api и присваиваю своим self
переменным:
func APIcall() {
ServerCommunicator.getPairs().done{ response -> Void in
for keyPathParam in response {
self.keyPathParam = keyPathParam.name
}
ServerCommunicator.getPair(with: self.keyPathParam).done{ ticker -> Void in
for data in self.contents {
data.name = ticker.name
data.price = ticker.price
data.volume = ticker.volume
self.contents.append(data)
}
}.catch{(err) in
print(err)
}
}.catch{(error) in
print(error)
}
}
Комментарии:
1. Когда вы перезагружаете
tableView
?2. о, хороший вопрос.. ) но у меня сбой уже в
numberOfRow
части TableView .. .3. Что такое сбой / ошибка?
4.
self.contents.count
это0
5. Нет, это не вызывает сбоя, что-то еще. Найдите его или поделитесь сообщением об ошибке здесь.
Ответ №1:
Прежде всего, если API отправляет всегда все ключи, объявите свойства необязательными и как константы, и, скорее всего, вам не нужен класс и соответствие Encodable
struct Entity: Decodable {
let name: String
let price: Double
let volume: Double
}
После получения данных с сервера вам необходимо создать новые экземпляры Entity
и назначить их массиву источников данных. Далее вам нужно DispatchGroup
обработать цикл и перезагрузить представление таблицы после создания последнего объекта.
Если вы хотите перезаписать self.contents
полученные данные, раскомментируйте removeAll
строку
func APIcall() {
ServerCommunicator.getPairs().done{ response in
// self.contents.removeAll()
let group = DispatchGroup()
for keyPathParam in response {
group.enter()
ServerCommunicator.getPair(with: keyPathParam.name).done{ ticker in
let entity = Entity(name: ticker.name, price: ticker.price, volume: ticker.volume)
self.contents.append(entity)
group.leave()
}.catch{(err) in
print(err)
group.leave()
}
}
group.notify(queue: .main) {
self.tableView.reloadData()
}
}.catch{(error) in
print(error)
}
}
Комментарии:
1. Большое спасибо за ваше время, советы и усилия.. Я ценю это .. позвольте мне протестировать это тогда ..)
2. спасибо за вашу помощь, я рад принять это как правильный ответ.. я уверен, что это работает, я протестировал это, это дало мне ожидаемую структуру ожидаемого результата.. однако остальное — это несоответствие типов в моей собственной структуре кода, я уверен, что ваша логика работает . .
3. теперь у меня возникла еще одна проблема, я думаю, это будет последняя проблема. . если бы я мог ее решить, я надеюсь, что решение этой проблемы будет сделано раз и навсегда . .
4. проблема в том
responseSerializationError
5. потому
// MARK: - TradingPairElement
что возвращает массив, в котором// MARK: - TickerByPair
возвращает просто простоеdictionary
и внутриfor loop
, я думаю, что-то пошло не такapiCall
, как я предполагаю..