заполните UITableViewCell с помощью jsonData

#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 данные были проанализированы и готовы к отображению … как это исправить?

мой класс модели ответа и остальная часть реализации выглядят следующим образом:

  1. Классы модели для 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 , как я предполагаю..