Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift如何知道布局是否在LayoutIfNeed()之后完成_Ios_Swift3_Uiview - Fatal编程技术网

Ios Swift如何知道布局是否在LayoutIfNeed()之后完成

Ios Swift如何知道布局是否在LayoutIfNeed()之后完成,ios,swift3,uiview,Ios,Swift3,Uiview,我有一个iPad数学程序,使用一个大数字库进行计算,然后根据这些计算更新UIView(myView)中多达20000个UILabel的数组 计算大约需要5秒钟,在此期间,每个UILabel的backgroundColor设置为一种颜色。因为屏幕上什么也没有发生,我有一个闪烁的UILabel inProgressLabel,它通知用户系统正在计算。然后我打电话给layoutIfNeeded,我的想法是当它完成时,屏幕将被更新。最后,我关闭闪烁的UILabel 以下是伪代码: inProgressL

我有一个iPad数学程序,使用一个大数字库进行计算,然后根据这些计算更新UIView(myView)中多达20000个UILabel的数组

计算大约需要5秒钟,在此期间,每个UILabel的backgroundColor设置为一种颜色。因为屏幕上什么也没有发生,我有一个闪烁的UILabel inProgressLabel,它通知用户系统正在计算。然后我打电话给layoutIfNeeded,我的想法是当它完成时,屏幕将被更新。最后,我关闭闪烁的UILabel

以下是伪代码:

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也不太可能是合适的;使用表视图或集合视图查看。作为一般规则,您应该尝试只对当前屏幕上的内容使用活动控件,这两种视图都提供了非常容易管理活动集的方法。每个视图都有一个内存占用空间,因为视图的内容是缓冲的——如果不必要地压缩内存,将损害您自己和其他正在运行的应用程序的性能