【问题标题】:Swift How to know if layout finished after layoutIfNeeded()Swift 如何知道 layoutIfNeeded() 之后布局是否完成
【发布时间】:2018-10-10 17:52:31
【问题描述】:

我有一个用于 iPad 的数学程序,它使用一个 Big Number 库进行计算,然后根据这些计算更新 UIView (myView) 中最多 20,000 个 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()

我的理解是 layoutIfNeeded() 是同步的。因此,屏幕将更新,然后,只有这样,闪烁的 inProgressLabel 才会关闭。但是,inProgressLabel 实际上在 layoutIfNeeded 调用后立即关闭,然后可能需要 5 秒钟才能更新 UILabel 数组。

我认为这可能是因为更新发生在不同的线程中。如果是这样,有没有办法确定 UIView 和 UILabel 数组何时完成更新(显示),以便我可以关闭闪烁的 UILabel?

提前非常感谢。

【问题讨论】:

    标签: ios swift3 uiview


    【解决方案1】:

    你可以试试

    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()
    }
    

    【讨论】:

      【解决方案2】:

      UIKit 控件不是线程安全的。从后台更新 UILabel 会产生未定义的行为。

      layoutIfNeeded 执行任何待处理的布局任务并返回。它对您将来可能计划进行的任何更改没有神奇的预见。

      您需要将工作安排在主队列之外进行,并确保在完成后将结果推送回主线程。如果分派各种计算分别发生是有意义的,请使用 Sh_Khan 建议的分派组。否则考虑只在一个块中执行后台计算,然后从那里跳回主队列。

      20,000 个 UILabel 也不太合适;研究使用表格视图或集合视图。作为一般规则,您应该尝试仅对当前屏幕上的任何内容使用活动控件,并且这两个视图都提供了非常容易管理该活动集的方法。每个视图都有内存占用,因为视图的内容是缓冲的——如果你不必要地挤压内存,你会损害你自己和其他正在运行的应用程序的性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 2011-09-12
        • 2014-05-08
        • 2020-02-06
        • 1970-01-01
        相关资源
        最近更新 更多