Ios Swift如何知道布局是否在LayoutIfNeed()之后完成
我有一个iPad数学程序,使用一个大数字库进行计算,然后根据这些计算更新UIView(myView)中多达20000个UILabel的数组 计算大约需要5秒钟,在此期间,每个UILabel的backgroundColor设置为一种颜色。因为屏幕上什么也没有发生,我有一个闪烁的UILabel inProgressLabel,它通知用户系统正在计算。然后我打电话给layoutIfNeeded,我的想法是当它完成时,屏幕将被更新。最后,我关闭闪烁的UILabel 以下是伪代码:Ios Swift如何知道布局是否在LayoutIfNeed()之后完成,ios,swift3,uiview,Ios,Swift3,Uiview,我有一个iPad数学程序,使用一个大数字库进行计算,然后根据这些计算更新UIView(myView)中多达20000个UILabel的数组 计算大约需要5秒钟,在此期间,每个UILabel的backgroundColor设置为一种颜色。因为屏幕上什么也没有发生,我有一个闪烁的UILabel inProgressLabel,它通知用户系统正在计算。然后我打电话给layoutIfNeeded,我的想法是当它完成时,屏幕将被更新。最后,我关闭闪烁的UILabel 以下是伪代码: inProgressL
inProgressLabel.turnOnBlinking()
for row in 0..<rowCount
{
for col in 0..<colCount
{
// perform some calculation
let z = buttonArray[row][col].performCalculation()
//now set the Label background based on the result of the calculation
buttonArray[row][col].setLabelBackground(z)
}
}
myView.layoutIfNeeded()
inProgressLabel.turnOffBlinking()
inProgressLabel.turnOnBlinking()
对于0..中的行,您可以尝试
let dispatchGroup = DispatchGroup()
for row in 0..<rowCount
{
for col in 0..<colCount
{
dispatchGroup.enter()
self.doCalcAndUpdateLbl(index: i) { (finish) in
dispatchGroup.leave()
}
}
}
dispatchGroup.notify(queue: .main) {
myView.layoutIfNeeded()
inProgressLabel.turnOffBlinking()
}
让dispatchGroup=dispatchGroup()
对于0..中的行,您可以尝试
let dispatchGroup = DispatchGroup()
for row in 0..<rowCount
{
for col in 0..<colCount
{
dispatchGroup.enter()
self.doCalcAndUpdateLbl(index: i) { (finish) in
dispatchGroup.leave()
}
}
}
dispatchGroup.notify(queue: .main) {
myView.layoutIfNeeded()
inProgressLabel.turnOffBlinking()
}
让dispatchGroup=dispatchGroup()
对于0..中的行,UIKit控件不是线程安全的。从后台更新UILabel会产生未定义的行为
layoutIfNeeded
执行任何挂起的布局任务并返回。它对你将来可能要做的任何改变都没有神奇的预见
您需要将工作安排在主队列之外,并确保在完成时将结果推回到主线程。如果分派不同的计算单独进行是有意义的,请使用Sh_Khan建议的分派组。否则,只需在单个块中执行后台计算,然后从那里跳回主队列。
2万个UILabel也不太可能是合适的;使用表视图或集合视图查看。作为一般规则,您应该尝试只对当前屏幕上的内容使用活动控件,这两种视图都提供了非常容易管理活动集的方法。每个视图都有一个内存占用空间,因为视图的内容是缓冲的——如果不必要地压缩内存,将损害您自己和其他正在运行的应用程序的性能。UIKit控件不是线程安全的。从后台更新UILabel会产生未定义的行为
layoutIfNeeded
执行任何挂起的布局任务并返回。它对你将来可能要做的任何改变都没有神奇的预见
您需要将工作安排在主队列之外,并确保在完成时将结果推回到主线程。如果分派不同的计算单独进行是有意义的,请使用Sh_Khan建议的分派组。否则,只需在单个块中执行后台计算,然后从那里跳回主队列。
2万个UILabel也不太可能是合适的;使用表视图或集合视图查看。作为一般规则,您应该尝试只对当前屏幕上的内容使用活动控件,这两种视图都提供了非常容易管理活动集的方法。每个视图都有一个内存占用空间,因为视图的内容是缓冲的——如果不必要地压缩内存,将损害您自己和其他正在运行的应用程序的性能