Swift - 如何根据异步下载的数据创建表视图?

时间:2015-01-06 11:42:04

标签: ios cocoa-touch swift

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

Map不是问题,因为我编写自定义函数来绘制地图并在dispatch_async(dispatch_get_main_queue()行完成后调用它 - map正在等待数据下载。但是,问题出现时我想对表格视图做同样的事情。

我的代码很长,所以我只是展示一小段内容,以便了解问题。

我尝试了以下修改:

    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;

但遗憾的是它无论如何都没有帮助 - 在下载数据之前,表视图再次加载,导致空表。

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

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

如果没有错误,就无法将它们置于异步任务中

我的问题是:如何处理这种东西(我的意思是当你想要一个元素,如表视图和#34;等待"首先要下载的数据,你不能把它放在下载任务)?

我希望我能够相对清楚地提出问题,提前谢谢

1 个答案:

答案 0 :(得分:7)

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

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

特别要考虑this section of the documentation。您可以通过异步调度self.tableView.reloadData()来逃避(假设您的应用程序的其余部分知道您已识别的回调方法中的新数据)。


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

当基础数据发生变化时(例如,因为您已经从Web下载了某些内容),您可以更改此数据结构(例如,替换数组)并告知表视图的相应部分重新加载。

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