Swift - 如何基于异步下载的数据创建一个 table 视图?

Swift - How to create a table view based on data downloaded asynchronously?

我的应用程序从网上下载 json,用图钉绘制地图并在 table 视图中显示数据。

Map 不是问题,因为我编写了自定义函数来绘制地图并在 dispatch_async(dispatch_get_main_queue() 行之后立即调用它,该行完美运行 - map 正在等待数据待下载。但是,当我想对 table 视图执行相同操作时,问题就来了。

我的代码很长,所以我将只展示一些简短的代码片段来说明问题所在。

我尝试了以下修改:

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
                // Do any additional setup after loading the view, typically from a nib.
                self.tableView.backgroundColor = UIColor.clearColor();
                self.tableView.delegate = self;
                self.tableView.dataSource = self;

但不幸的是,它没有任何帮助 - table 视图在数据下载之前再次加载,这导致空 table。

表格视图使用自己的预定义函数,例如:

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

将它们放入异步任务中是不可能没有错误的

我的问题是:如何处理那种东西(我的意思是当你想要一个元素比如 table view "wait" 来首先下载数据并且你不能把它在下载任务中)?

我希望我能够比较清楚地提出问题,在此先感谢

table 视图通过委托和数据源工作。通过设置这些属性,您可以告诉 table 视图报告事件的位置以及查找数据的位置。

因为这些方法被称为 'by' table 视图(或至少由 UI 线程发送),所以您不能直接 运行 它们。您要做的是设置委托和数据源(就像您所做的那样),然后调用 table 视图本身的方法来告诉它何时检查新数据。

特别是,您应该查看 this section of the documentation。您也许可以通过异步调度 self.tableView.reloadData()(前提是您的应用程序的其余部分知道您已识别的回调方法中的新数据)逃脱。


基本思想是您的 UITableViewDataSource 知道如何使用来自某些数据结构的信息填充 table 视图(例如,您可能有一个数组作为 属性)。

当基础数据发生变化时(例如,因为您从网上下载了一些东西),您会更改此数据结构(例如,替换数组)并告诉 table 视图的适当部分重新加载。

然后将调用各种 UITableViewDataSource 方法,这些方法将使用新数据重新填充 table 视图。