视图控制器不会立即呈现

3
在我的社交应用中,我有一个名为“主页”的页面,在其中有一个tableView,其中包含最多3个不同的单元格!然后我实现了didSelect数据源方法,在该方法中执行一些比较,以确定我选择了什么类型的单元格...(每次需要进行3或4次比较)。对于我选择的每个单元格,都会实例化一个新的视图控制器。一个用于照片展示,另一个用于自定义相机展示,最后一个用于另一个简单的视图控制器展示...

问题是,出于某种未经解释的原因,如果我按下iPhone的Home按钮,然后再次打开我的应用程序并选择其中一个单元格,它需要长达7秒才能呈现出视图控制器!然后,如果我关闭该视图控制器,返回到“主页”并选择另一个单元格,则一切正常!

有人知道可能发生了什么吗?

编辑:

if currentArea != "Somewhere" {
        if gettingContent == false && objectsArray.count == 0 {
            if firstOfLocalLeaderboard != nil {
                if indexPath.row == 0 {
                    let vc = self.storyboard!.instantiateViewController(withIdentifier: "TopTenAreaController") as! TopTenAreaController
                    vc.area = currentArea

                    let navVC = UINavigationController()
                    navVC.viewControllers = [vc]

                    self.present(navVC, animated: true, completion: nil)
                }
                else if indexPath.row == 1 {
                    if localLeaderboard.count > 0 {
                        let vc = self.storyboard?.instantiateViewController(withIdentifier: "PhotoViewController") as! PhotoViewController

                        vc.objectsArray = localLeaderboard
                        vc.currentArea = currentArea

                        let navVC = UINavigationController()
                        navVC.viewControllers = [vc]

                        self.present(navVC, animated: true, completion: nil)
                    }
                    else {
                        let vc = self.storyboard!.instantiateViewController(withIdentifier: "CameraViewController") as! CameraViewController
                        vc.appearedFromHome = true

                        let navVC = UINavigationController()
                        navVC.viewControllers = [vc]

                        self.present(navVC, animated: true, completion: nil)
                    }
                }
            }
            else {
                if indexPath.row == 0 {
                    if localLeaderboard.count > 0 {
                        let vc = self.storyboard?.instantiateViewController(withIdentifier: "PhotoViewController") as! PhotoViewController

                        vc.objectsArray = localLeaderboard
                        vc.currentArea = currentArea

                        let navVC = UINavigationController()
                        navVC.viewControllers = [vc]

                        self.present(navVC, animated: true, completion: nil)
                    }
                    else {
                        let vc = self.storyboard!.instantiateViewController(withIdentifier: "CameraViewController") as! CameraViewController
                        vc.appearedFromHome = true

                        let navVC = UINavigationController()
                        navVC.viewControllers = [vc]

                        self.present(navVC, animated: true, completion: nil)
                    }
                }
            }
        }

你是否在后台线程中执行某些操作? - mfaani
@Rikh 请查看更新后的代码。 - Sotiris Kaniras
@Honey 不是的... - Sotiris Kaniras
1
你在 viewDidAppearviewWillAppear 方法里做了什么耗时的操作吗?同时,在相关的 self.present 行上放一个断点,检查 present 语句是立即执行还是延迟了 7 秒后才执行的?这种情况在 所有 导航控制器中都存在,还是只有某一个? - Rikh
你虽然没有在后台线程做任何事情,但是 DispatchQueue.main.async 解决了你的问题?我有点困惑。 - mfaani
显示剩余2条评论
1个回答

2

试试这个

DispatchQueue.main.async {
    // present vc
}

2
他在后台没有做任何事情...所以他已经在主线程上了... - mfaani
3
@shallowThought - UI更新必须在主线程上进行,如果没有这样做,就会出现奇怪的延迟。因此,Nikita猜测如果你看到奇怪的延迟,那么你可能是在后台线程中执行某些操作。如果是这样,把它分派到主线程,可以解决这个问题(如果这确实是问题)。个人而言,我不会在代码中随意添加分派到主线程的语句,而是会插入先决条件(例如dispatchPrecondition(condition: .onQueue(.main))),并查看是否可以确认Nikita的假设,并缓慢回溯以找出问题出现的原因。 - Rob
2
坦白地说,尽管Nikita的处方适用于这些症状的一种可能来源,但我对诊断持怀疑态度。像Honey一样,在得出结论之前,我需要看到一些证据表明你正在后台线程上执行操作。 - Rob
2
正确,如果不是主线程,dispatchPrecondition 将无法通过,帮助我们确定 Nikita 的假设是否正确。只有在失败的情况下,我们才会去查找如何发生这种情况(因为你问题中的代码不应该出现这种情况)。我的观点是,你不应该随意在代码中添加到主线程的调度:这只是代码气味,表示“我不知道此代码在哪个线程上运行”,这通常是更深层次问题的症状。你真的应该知道各种例程在哪个线程上运行。 - Rob
2
@Honey - 不,这更像是一个“assert”语句:如果前置条件得到满足,它将静默地继续执行。但如果不满足,它将崩溃。但是,如果你通过调试器运行它,执行将立即停止,你可以看到它在哪个线程上运行,堆栈跟踪等等,也就是说,有很多线索可以帮助你诊断为什么它不在主线程上。 - Rob
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接