我的对象数组为零,而我的数据正确

时间:2018-12-01 18:33:54

标签: json swift

我尝试在不使用任何框架解析数据的tableView中显示数据,但是当我将数据添加到表中并对其进行调试时,输出为零,而我检索到的数据得到很好的解析,是否忘记要做的事?

我将结构用作参数:

    enum Types {
     case School
     case Hospital
     case Station_Essence
     case Restaurant
}

struct Adresse {
    public var title: String
    public var details: String?
    public var type: Types
    public var coordinate: [String: Any]
}

在我的ViewController中,我按以下步骤进行操作:

    class ListMapViewController: UIViewController {

    @IBOutlet var TitleTableView: UITableView!
    @IBOutlet var MapView: MKMapView!

    var adresse: [Adresse]?

    override func viewDidLoad() {
        super.viewDidLoad()

        self.TitleTableView.register(UINib(nibName: "ListMapTableViewCell", bundle: nil), forCellReuseIdentifier: "Adresse")
        self.TitleTableView.delegate = self
        self.TitleTableView.dataSource = self
        guard let POI = URL(string: "https://moc4a-poi.herokuapp.com/") else {
            return
        }

        let task = URLSession.shared.dataTask(with: POI) { (data, response, error) in
            guard let dataResponse = data else { return }
            if let json = try! JSONSerialization.jsonObject(with: dataResponse, options:[]) as? [[String: Any]] {
                for data in json {
                    let title = data["title"] as! String
                    let details = data["details"] as? String
                    guard let type = data["type"] as? Int else { return }
                    let valueType = self.valueType(dataType: type)
                    guard let coordinates = data["coordinates"] as? [String: Any] else { return }
                    self.adresse?.append(Adresse(title: title, details: details, type: valueType, coordinate: coordinates))
                }
            }
            print(self.adresse)
        }
        self.TitleTableView.reloadData()
        task.resume()

    }

    private func valueType(dataType: Int) -> Types {
        if(dataType == 1) {
            return Types.School
        } else if (dataType == 2) {
            return Types.Hospital
        } else if (dataType == 3) {
            return Types.Station_Essence
        } else {
            return Types.Restaurant
        }
    }

}

extension ListMapViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.adresse?.count ?? 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Adresse", for: indexPath) as! ListMapTableViewCell
        if let adresse = self.adresse?[indexPath.row] {
            cell.draw(adresse: adresse)
        }
        return cell
    }


}

extension ListMapViewController: UITableViewDelegate {

}

1 个答案:

答案 0 :(得分:1)

您有两个大问题。

  1. self.adressenil。您永远不会为其分配值。因此,所有self.adresse?...均不执行任何操作。
  2. 您过早致电reloadData。更新数据后,需要在完成块内完成此操作。而且它必须在主队列中。

要修复#1,请将var adresse: [Adresse]?更改为var adresse = [Adresse]()。然后,您可以在使用?之后清除所有adresse

要修复#2,请添加:

DispatchQueue.main.async {
    self.TitleTableView.reloadData()
}

紧接在完成块末尾的print之后。不要忘记删除当前对reloadData的呼叫。