获取行数据时在表视图中显示活动指示器
Posted
技术标签:
【中文标题】获取行数据时在表视图中显示活动指示器【英文标题】:Activity Indicator display in Table View whilst row data is being fetched 【发布时间】:2010-04-16 04:05:25 【问题描述】:我正在从 tableview1.row 导航到 tableview2,它有很多行被获取。鉴于加载时间约为 3 秒,我希望导航在选择 tableview1.row 后立即滑入 tableview2,然后在 tableview2 上方显示 UIActivityIndicatorView,同时获取数据,然后在其基础表视图中呈现。注意,tableview2 实际上是父 UIView 的子视图(而不是父 UITableView)。
我看过这个帖子:Activity indicator should be displayed when navigating from UITableView1 to UITableView2
... 它给出了将数据获取周围的活动指示器 start 和 stopAnimating 调用添加到 tableview2 的 viewDidLoad 的指令。
问题是,我不确定上述解决方案如何工作,因为 viewDidLoad 在 tableview2 明显滑入视图之前运行和完成。
另外,我还尝试在 IB 中的 tableview2 上添加一个活动指示器,并将 IBOutlet 指示器的开始/停止动画代码添加到 viewDidAppear 中。发生的情况是数据提取运行,我可以看到指示器在旋转,但在提取结束时,表视图是空的。似乎 viewDidAppear 为时已晚,无法将数据添加到表格视图,因为 cellForRowAtIndexPath 等已经触发。
任何人都可以提出任何建议吗?我很可能在这里遗漏了一些明显的东西(我现在将近凌晨 5 点,我认为我的大脑很糊状)。我应该从 viewDidAppear 重新触发 cellForRowAtIndexPath 等吗?我的表格视图是子视图而不是父视图的问题吗?
谢谢
【问题讨论】:
我很想看看可可忍者的回答。可可中的事件堆栈让我感到困惑,我可以看到你的问题,但遗憾的是我无法提供帮助,因为我遇到了同样的问题。 【参考方案1】:我又看了一下自己的问题,答案实际上很简单。任何非常密集的处理通常不应该在主线程上运行。我试图在同一个线程上进行我的数据密集型获取和活动指示器的 UI 显示,因此这些都是按顺序处理的,一个接一个。
解决方案是进入我的新视图控制器,然后 a) 在主线程上启动活动指示器动画,然后 b) 在另一个线程上运行数据密集型获取(使用 performSelectorInBackground)。无法从后台线程应用任何与 UI 相关的更新。这些应该交回主线程。
已经有很多关于此的 SO 帖子(例如 here),我很遗憾没有从一开始就了解这些内容 :)
【讨论】:
以上是关于获取行数据时在表视图中显示活动指示器的主要内容,如果未能解决你的问题,请参考以下文章