行业动态
iOS性能优化(二):UITableView自动计算Cell高度思路
2021-02-23

上一篇文章:IOS性能优化(二) UITableView自动计算单元格高度的想法

在理解此问题之前,让我们对其进行回顾:IOS查看生命周期

initWithCoder:(NSCoder *)aDecoder:使用情节提要或Xib创建视图时

loadView:加载视图时

viewDidLoad:加载视图时

viewWillAppear:当控制器的视图即将显示时

viewWillLayoutSubviews:当控制器的视图即将布置子控件时

viewDidLayoutSubviews:当控制器的视图布局子控件完成时

viewDidAppear:当控制器的视图完全显示时

viewWillDisappear:当控制器的视图即将消失

viewDidDisappear:当控制器的视图完全消失

deinit:销毁控制器时

首先,我们创建一个空项目,并将两个控制器添加到该项目:第01页和第02页。然后重写以下方法:

覆盖func loadView(){

super.loadView()

print(“ --- Page 01-loadView创建视图---”)

}

ios开发 界面push卡顿_ps4界面卡顿_ios push导航栏消失

覆盖func viewDidLoad(){

super.viewDidLoad()

print(“--页面01-viewDidLoad初始化---”)

}

覆盖func viewWillAppear(_动画:布尔){

print(“ --- Page 01-viewWillAppear将显示---”)

}

覆盖func viewDidAppear(_动画:布尔){

print(“ --- Page 01-viewDidAppear display ---”)

}

覆盖func viewWillDisappear(_动画:布尔){

print(“ --- Page 01-viewWillDisappear即将消失---”)

}

覆盖func viewDidDisappear(_动画:布尔){

print(“ --- Page 01-viewDidDisappear消失了---”)

ios push导航栏消失_ps4界面卡顿_ios开发 界面push卡顿

}

deinit {

print(“ --- Page 01-deinit destroy ---”)

}

第02页类似,但也重写了上面的方法。

接下来是重点:

1、启动项目,终端日志:

-第01-loadView页以创建视图---

---第01-viewDidLoad页已初始化---

-页面01-viewWillAppear将显示---

---第01-viewDidAppear显示---

2、 Page 01推送至页面02,终端日志:

---第02-loadView页以创建视图---

-第02页的viewDidLoad已初始化--

-第01页-viewWillDisappear即将消失---

ps4界面卡顿_ios push导航栏消失_ios开发 界面push卡顿

-第02页-viewWillAppear将显示----

-页面01-viewDidDisappear消失了--

分析:

在显示第02页之前(---将显示第02页-viewWillAppear ---),分别调用了三种方法。如果这三种方法中的操作都很耗时,则会导致冻结。

让我们修改代码并在第01页上添加耗时的操作:

覆盖func viewWillDisappear(_动画:布尔){

print(“ --- Page 01-viewWillDisappear即将消失---”)

sleep(3)

}

这时,如果您从第01页推到第02页ios开发 界面push卡顿,它将冻结(您可以看到该按钮已响应该事件,但第02页没有推开)。

ios开发 界面push卡顿

纸箱

然后我们将耗时的代码修改为:

重写func viewDidDisappear(_animated:Bool){

print(“ --- Page 01-viewDidDisappear消失了---”)

ps4界面卡顿_ios开发 界面push卡顿_ios push导航栏消失

sleep(3)

}

再次从01页推到02页,它不会冻结。

ios开发 界面push卡顿

流畅

3、第02页弹出第01页,终端日志:

---第02页-viewWillDisappear即将消失---

-页面01-viewWillAppear将显示---

-第02页的viewDidDisappear消失了--

---第01-viewDidAppear显示---

---第02页-deinit销毁---

分析:

再次显示页面01时(---将显示页面01-viewWillAppear ---),将调用页面02的viewWillDisappear方法。如果此方法耗时,则会导致Pop冻结。

摘要:

在开发过程中,请勿在显示页面之前调用耗时的操作。例如:如果您需要在页面消失时执行某些操作,则可以将其放在viewDidDisappear方法中ios开发 界面push卡顿,而不是viewWillDisappear中。

在Android开发中,如果主线上的耗时操作超过5秒,则会导致强制关闭。尽管IOS没有这种机制,但系统不会终止我们的应用程序,但是如果发生这种情况,建议在子线程中执行它。


393701618