【问题标题】:Swift - How to create a table view based on data downloaded asynchronously?Swift - 如何根据异步下载的数据创建表格视图?
【发布时间】:2015-01-06 11:42:03
【问题描述】:

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

地图不是问题,因为我编写了我的自定义函数来绘制地图并在 dispatch_async(dispatch_get_main_queue() 行之后立即调用它,这很好 - 地图正在等待下载数据。但是,问题来了我想对表格视图做同样的事情。

我的代码很长,所以我将只显示简短的 sn-ps 以了解问题所在。

我尝试了以下修改:

    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

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

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

希望我能比较清楚地提出问题,提前谢谢

【问题讨论】:

    标签: ios cocoa-touch swift


    【解决方案1】:

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

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

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


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

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

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

    【讨论】:

    • 请注意,在后台线程取数据时,一定要确保在主线程调用“reloadData”。
    • 谢谢,我将阅读有关重新加载 tableview 数据的信息。此外,我忘了提到我创建了全局变量来保存从 json 获得的数组,所以我想重新加载可能会解决问题。这将是关于加载某种默认的表格视图,然后用下载的数据重新加载它们,我猜对了吗?
    • @DawidCedrych 是的,基本上。我在高级描述中进行了编辑
    • 我在调度后只添加了一行 self.tableView.reloadData() ,我的所有问题都消失了,谢谢!
    • 我注意到一个奇怪的事实:当我在表格视图中使用自定义单元格时,程序崩溃了。 code让单元格:自定义单元格? = self.tableView.dequeueReusableCellWithIdentifier("Cell") 作为 CustomCell? cell?.backgroundColor = UIColor.orangeColor() 返回单元格! code 错误是:EXC_BREAKPOINT I386_BPT
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2023-03-31
    相关资源
    最近更新 更多