我的应用程序从网上下载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;等待"首先要下载的数据,你不能把它放在下载任务)?
我希望我能够相对清楚地提出问题,提前谢谢
答案 0 :(得分:7)
表视图通过委托和数据源工作。通过设置这些属性,您可以告诉表格视图报告事件的位置以及查找其数据的位置。
因为这些方法被表视图“调用”(或者至少由UI线程发送),所以不直接运行它们。你做的是设置委托和数据源(就像你所做的那样),然后调用表视图本身的方法来告诉它何时检查新数据。
特别要考虑this section of the documentation。您可以通过异步调度self.tableView.reloadData()
来逃避(假设您的应用程序的其余部分知道您已识别的回调方法中的新数据)。
基本思想是你的UITableViewDataSource
知道如何用来自某些数据结构的信息填充表视图(例如,你可能有一个数组作为属性)。
当基础数据发生变化时(例如,因为您已经从Web下载了某些内容),您可以更改此数据结构(例如,替换数组)并告知表视图的相应部分重新加载。
然后将调用各种UITableViewDataSource
方法,这些方法将使用新数据重新填充表格视图。