视图控制器不会立即呈现

Posted

技术标签:

【中文标题】视图控制器不会立即呈现【英文标题】:View Controller doesn't get presented immediately 【发布时间】:2016-12-03 15:39:05 【问题描述】:

在我的社交应用程序中,我有一个“主页”屏幕,其中有一个 tableView,其中包含多达 3 个不同的单元格!然后我实现了 didSelect 数据源方法,在这里我执行了一些比较以确定我刚刚选择了哪种单元格...(每次 3 或 4 次比较)对于我选择的每个单元格,都会实例化一个新的视图控制器。一个用于照片演示,另一个用于自定义相机演示,最后是另一个简单的视图控制器演示......

问题是,由于无法解释的原因,如果我按下 iPhone 的主页按钮,然后再次打开我的应用程序并选择其中一个单元格,它需要 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)
                    
                
            
        

【问题讨论】:

您能否发布一些代码以显示相关的didSelectRow 方法以及您的prepareForSegue 你是否在后台线程中做某事? @Rikh 查看更新的代码 @Honey Nope.... 您是否在您的viewDidAppearviewWillAppear 中做任何可能占用大量时间的事情?还要在您的相关self.present 行设置一个断点,并检查当前语句是立即执行还是延迟 7 秒后执行? 所有导航控制器或只有一个导航控制器会发生这种情况吗? 【参考方案1】:

试试这个

DispatchQueue.main.async 
    // present vc

【讨论】:

他没有在后台做任何事情...所以他已经在主线程上... @shallowThought - UI 更新必须发生在主线程上,如果你不这样做,你会看到奇怪的延迟。所以 Nikita 猜测如果你看到奇怪的延迟,你正在从后台线程做一些事情。如果这是真的,那么将它分派到主线程,它可以解决它(如果这确实是问题)。就个人而言,我可能不会将代码与调度撒在主线程上,而是插入先决条件(例如dispatchPrecondition(condition: .onQueue(.main))),看看我是否可以确认 Nikita 的论文,然后慢慢回溯以弄清楚这是如何发生的。 坦率地说,虽然 Nikita 的处方适合这些症状的一个可能来源,但我对诊断持怀疑态度。和 Honey 一样,在得出这个结论之前,我需要看到一些证据表明你在后台线程上做事。 正确,如果不是主线程,dispatchPrecondition 只会失败,帮助我们确定 Nikita 的假设是否正确。只有当这失败时,我们才开始确定这是如何发生的(因为您问题中的代码不应该这样做。我的观点是,您不应该只是将您的代码与调度散布到主线程:这只是“我不知道这段代码在哪个线程上运行”,这通常是更深层次问题的症状。你真的应该知道各种例程在哪个线程上运行。 @Honey - 不,它更像assert 语句:如果满足前提条件,它将悄悄地继续执行。但是,如果不是,它将崩溃。但是,如果您通过调试器运行它,执行将停在那里,您可以看到它在哪个线程上运行,堆栈跟踪等,即很多线索可以帮助您诊断 为什么 它不在主线程上。

以上是关于视图控制器不会立即呈现的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?

iOS - 在关闭其他视图控制器后立即呈现视图控制器

在没有动画的情况下关闭视图控制器后立即呈现视图控制器

iOS 8 – 在设置关键窗口或关闭并立即呈现另一个视图控制器后快速呈现视图控制器时出现故障

UIViewController 的视图在呈现后立即改变尺寸

为啥关闭视图控制器不会从内存中清除呈现的控制器?