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

DCD*_*CDC 3 cocoa-touch ios 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;
Run Code Online (Sandbox Code Playgroud)

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

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

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
Run Code Online (Sandbox Code Playgroud)

如果没有错误,将它们置于异步任务中是不可能的

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

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

sap*_*api 7

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

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

特别是,您应该查看文档的这一部分.您可以通过异步调度来逃脱self.tableView.reloadData()(假设您的应用程序的其余部分知道您已识别的回调方法中的新数据).


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

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

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