用 JSONdata 填充 UITableViewCell
fill in UITableViewCell with JSONdata
我试图在我的 tableView 单元格中显示一些 json 数据,并解析了 json 数据。
但是
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.contents.count
}
返回 0
因此,我无法显示 UITableViewCell
中的数据,尽管我的所有 JSON
数据都已解析并准备好显示...。
如何解决?
我的响应模型class和其余实现如下:
- 模型 classes for
json
response
// 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)
}
}
首先,如果 API 始终发送所有键,则声明属性 non-optional 并作为常量,很可能您不需要 class 并符合 Encodable
struct Entity: Decodable {
let name: String
let price: Double
let volume: Double
}
从服务器获取数据后,您必须创建 Entity
的新实例并将它们分配给数据源数组。此外,您需要 DispatchGroup
来处理循环并在创建最后一个实体后重新加载 table 视图。
如果你想用接收到的数据覆盖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)
}
}
我试图在我的 tableView 单元格中显示一些 json 数据,并解析了 json 数据。
但是
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.contents.count
}
返回 0
因此,我无法显示 UITableViewCell
中的数据,尽管我的所有 JSON
数据都已解析并准备好显示...。
如何解决?
我的响应模型class和其余实现如下:
- 模型 classes for
json
response
// 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)
}
}
首先,如果 API 始终发送所有键,则声明属性 non-optional 并作为常量,很可能您不需要 class 并符合 Encodable
struct Entity: Decodable {
let name: String
let price: Double
let volume: Double
}
从服务器获取数据后,您必须创建 Entity
的新实例并将它们分配给数据源数组。此外,您需要 DispatchGroup
来处理循环并在创建最后一个实体后重新加载 table 视图。
如果你想用接收到的数据覆盖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)
}
}