我正在使用一个有很多工作循环的应用程序。循环生成一串数字,然后将它们放入UITableView
。当工作正在进行时,我想显示一个UIActivityIndicatorView
。我将活动指示器添加到屏幕并居中。起初,我没有得到活动指标。我意识到这是因为活动指示符与循环在同一线程上运行,并且循环运行时该指示符永远不会更新。我做了一些关于如何创建后台线程的研究,并提出了这个问题。带循环的活动指示器
self.progressIndicator.startAnimating()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {() -> Void in
for var instance = 0; instance < numberCount!; instance++ {
//Lots of work done in here. Items are added to a
//collection that is used to populate the table view.
//Takes around 10 seconds to execute.
}
NSNotificationCenter.defaultCenter().postNotificationName("FinishedNumbers", object: nil)
});
活动指示器正在主线程上运行,并且循环的处理在后台运行。我创建了一个通告程序,用于调用函数来调用reloadList,并在数字列表完成后停止活动指示符。
func doneWithCreateNumbers(notification: NSNotification) {
self.numberList.reloadData()
self.progressIndicator.stopAnimating()
}
虽然这确实奏效,但它不能正常工作。有几个问题。
尽管循环的处理在10秒内完成,但需要更长的时间来填充列表并且活动指示器停止旋转。我在doneWithCreateNumbers函数中放置了一个断点,并检查了数字集合的数量,并且它中包含正确数量的项目。在重新加载列表并停止活动指示器执行的代码之后,需要30到40秒才能填充列表并且活动指示器停止运行。
名单并最终填充和指示灯消失了,但我得到的调试窗口此错误消息:
此应用程序从后台 线程修改自动布局引擎,这可能会导致发动机腐败和怪异的崩溃。这个 将在未来的版本中导致异常。
我试过用一些方法重新排列所有这些,但没有什么比我现在有更好的工作。我重新安排它的一种方法是在循环后面放置reloadData和stopAnimating。它没有更好的工作,我仍然有上面列出的错误。
我错过了这里的东西,但不知道是什么。有任何想法吗?
谢谢。这工作完美。我将我的tableView.reloadData调用添加到第二个主队列中,并且所有问题都已清除。感谢您花时间发布此信息。 –
很高兴帮助,欢呼! – Abhinav