用 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和其余实现如下:

  1. 模型 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)
    }
}