viewWillAppear 杂谈

作为 view 的状态之一,viewWillAppear 的关注率极高,所以其实并没有什么好说的…我们都知道它会在 view 每一次将要准备出现之前被调用,所以常常可以用来初始化一些基本数据。

前两周花了一点点时间重构了组里的某个小应用,前开发者新手上路,感觉不少代码值得推敲。在 debug 的时候发现应用一到后台就自动退出了,根本无法看它在后台的活动,震惊之余发现 info.plist 的 Application does not run in background 被设置为了 YES…反复揣摩整个应用的功能也不知道这么做目的何在,于是果断将其改为了 NO

不过事情并没有那么简单,毕竟这是一段关于 viewWillAppear 的杂谈。

后来随着时间的推移,总算发现禁止后台运行的“用处”了。某个 view 有一个相对特殊的需求,应用从后台回到前台时需要重新初始化它的数据,尽管在 viewWillAppear 中准备了完备的初始化代码,但是这个状态的迁移并不能认为是 view 即将出现,毕竟 view 并没有消失,一直都是显示状态。所以自然 viewWillAppear 就不会被调用,为了解决这个问题,于是这位同学想了这个办法。

不得不承认这个思路还是很清奇的,但是为了避免一些不必要的麻烦,我还是决定改用常规解决方案。在应用重回前台的时候发一个通知,告诉 view 可以重新初始化数据了。这种情况下,在 viewWillAppear 中添加一个对 .UIApplicationWillEnterForeground 通知的观察应该是一个不二的选择,它也常常被用于处理像是电话强制中断之类的需求:

1
NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: .UIApplicationWillEnterForeground, object: nil)

这个方案可是说是比较优雅的,不过不可以忘记移除通知。关于声明周期这些事儿,有时候真是操碎了心~