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 Profiler 在 Instruments 中运行应用程序。 这至少应该告诉你是否有一些缓慢的绘图代码,或者 UIKit 中的某些东西是否会减慢它。
【讨论】:
以上是关于viewWillAppear 和 viewDidAppear 之间的滞后的主要内容,如果未能解决你的问题,请参考以下文章
viewWillAppear 和 viewDidAppear 之间的操作?
appDelegate 设置 rootViewController 和 viewWillAppear 不被调用?
如何在自定义导航中添加 viewwillappear 和 viewdidappear 之间的延迟?
viewWillAppear 和 viewWillDisappear 之间的排序问题