微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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;

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

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

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

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

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

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

解决方法

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐