viewWillAppear 和 viewDidAppear 之间的滞后

Posted

技术标签:

【中文标题】viewWillAppear 和 viewDidAppear 之间的滞后【英文标题】:Lag between viewWillAppear and viewDidAppear 【发布时间】:2013-11-20 04:33:15 【问题描述】:

我在使用 presentViewController 作为库的一部分时遇到了一个奇怪的问题。

使用该库的代码调用此方法。从调用 presentViewController 到运行完成块最多需要 12 秒。但并非所有时间通常它几乎是瞬时的。

但是,如果我在屏幕“滞后”时触摸屏幕上的任何位置,它会立即触发。

-(void) advancedMenuWithPresentingViewController
                    :(UIViewController *)presentingViewController
            animated:(BOOL)animated
             onClose:(void (^)(void))onClose
             onPrint:(void (^)(NSString *, NSString *))onPrint
    AdvancedMenuViewController *amc = [[AdvancedMenuViewController alloc] init];
        AdvancedMenuViewController * __weak weakAmc = amc;

        [amc setOnClose:^(void)
         
             [weakAmc dismissViewControllerAnimated:animated completion:^
                 onClose();
             ];
         ];
        [amc setOnPrint:onPrint];
    //Time from here
    [presentingViewController presentViewController:amc
                                               animated:animated
                                             completion:^
              //To here
         ];

viewDidLoad 和 viewWillAppear 的调用没有任何延迟,然后在调用 viewDidAppear 之前会有很长的延迟(除非您触摸屏幕)。

这些方法中没有任何东西会减慢它的速度。因为它通常工作正常。

如果有人能阐明这个问题,我将不胜感激,最令人困惑的部分是,如果您在触发 advancedMenuWithPresentingViewController 后与屏幕进行交互,它将立即发生。

【问题讨论】:

是否在主线程上调用presentViewController:animated:completion: 它是从 tableview 中的 didSelectRowAtIndexPath 调用的。 @rmaddy 我认为你是正确的,尽管从主函数调用函数(并且我找不到任何可见的代码来改变线程)。我用 dispatch_get_main_queue() 包装了 presentViewController 并且到目前为止还无法复制它。烦人的部分是该错误一开始就很难复制,需要 5-10 分钟才能完成相同的过程。感谢您的帮助。 【参考方案1】:

替换

[presentingViewController presentViewController:amc
                                               animated:animated
                                             completion:^
              //To here
         ];

    dispatch_async(dispatch_get_main_queue(), ^
        [presentingViewController presentViewController:amc
                                               animated:animated
                                             completion:^
        //To here
        ];
    );

解决了问题。

感谢 rmaddys 的建议。

【讨论】:

这也为我解决了这个问题,即使 presentViewController 总是从主线程调用。有没有人知道这里发生了什么?【参考方案2】:

使用 Time ProfilerInstruments 中运行应用程序。 这至少应该告诉你是否有一些缓慢的绘图代码,或者 UIKit 中的某些东西是否会减慢它。

【讨论】:

以上是关于viewWillAppear 和 viewDidAppear 之间的滞后的主要内容,如果未能解决你的问题,请参考以下文章

viewWillAppear 和 viewDidAppear 之间的操作?

appDelegate 设置 rootViewController 和 viewWillAppear 不被调用?

如何在自定义导航中添加 viewwillappear 和 viewdidappear 之间的延迟?

viewWillAppear 和 viewWillDisappear 之间的排序问题

关于 viewController 的“viewDidLoad”和“viewWillAppear”方法

动画 viewWillAppear 和 viewWillDisappear?