【发布时间】:2021-02-03 10:46:43
【问题描述】:
我想监控从 UIViewController 开始运行 init 方法到用户真正看到屏幕上显示的内容之间需要多长时间。我知道 viewDidAppear 是结束计时器的好地方,但在某些情况下,我的应用程序需要从 Web 获取数据,然后在下载完成后呈现 UITableViewCells 或其他视图。我想知道是否有任何通用的方法来处理所有情况。
【问题讨论】:
标签: ios uiviewcontroller apm
我想监控从 UIViewController 开始运行 init 方法到用户真正看到屏幕上显示的内容之间需要多长时间。我知道 viewDidAppear 是结束计时器的好地方,但在某些情况下,我的应用程序需要从 Web 获取数据,然后在下载完成后呈现 UITableViewCells 或其他视图。我想知道是否有任何通用的方法来处理所有情况。
【问题讨论】:
标签: ios uiviewcontroller apm
一个好地方是viewDidLayoutSubviews。根据苹果文档,viewDidLayoutSubviews 被调用以通知视图控制器它的视图刚刚布置了它的子视图,因此每次更新视图(旋转、更改等)时都会调用此方法。这种方法的缺点是它被称为 A LOT,对于每次布局更改,因此您可能应该在那里进行一些额外的计算(您是否收到了来自服务器的响应,您的数据源是否已更新)。这回答了您的具体问题 - “在 iOS 中,有没有办法找出屏幕上是否呈现了任何视图?” - 但我不建议这样做。
您可能想为您正在使用的 API 实现一些分析日志记录,所以在我看来,最好的方法是拥有一个实现两种方法(加载开始 - 加载完成)的日志记录类。并在您的 ViewControllers 中调用这些方法。 (也许您可以创建一个基础 ViewController 类,并且您的所有视图控制器都应该继承该 ViewController - 在该基础 ViewController 中,您只能在 viewDidLoad 中调用加载启动方法一次 - 因为您覆盖了该 viewDidLoad - 这将为您节省几行代码忘记在 VC 中调用方法的风险)。
在布局 UI 时,操作系统通常足够快(除非您对 UI 做了一些非常奇怪的事情),因此唯一减慢加载速度的是 WebAPI 调用,因此您不必介意布局方法。 请让我知道这是否有意义。
【讨论】: