在调用viewDidDisappear后修改视图是否是一种不好的做法?

问题描述 投票:0回答:1

我有UITabBarController,在UIViewController之一中,我使用UICollectionView每5秒滚动一次Timer。这是我的简短代码:

override func viewDidLoad() {
    super.viewDidLoad()
    configureTimer()
}

private func configureTimer() {
    slideTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(scrollCollectionView), userInfo: nil, repeats: true)
}

@objc func scrollCollectionView() {
    collectionView.scrollToItem(at: someIndexPath, at: .centeredHorizontally, animated: true)
}

完美。但是我认为这是一个大问题。当然,我可以从此UIViewController打开另一个屏幕(例如,我可以点击另一个标签或按另一个UIViewController)。这意味着,包含UIViewController的我的UICollectionView的视图消失了。换句话说,将调用viewDidDissapear。但是我的计时器仍然存在,我对此有很深的了解,可能还有保留周期。它保持工作状态,即使我的视图消失了,每个5秒的scrollCollectionView方法也会被调用。我不知道怎么办,但是iOS会以某种方式处理它。换句话说,即使它不可见,它也可以修改视图。这怎么可能,是一种好的做法?当然,我可以在viewDidDissapear中使计时器无效,然后在viewDidAppear中启动它。但是我不想失去我的计时器值,也不想再次从零开始。还是可以使deinit中的计时器无效?我的问题涵盖了相当普遍的情况。例如,如果我发出网络请求并打开另一个UIViewController。该请求完成后,我应该修改UI,但是现在在另一个屏幕上。是否可以允许iOS修改UI(即使它不可见)?

ios memory-management timer uikit
1个回答
0
投票

一些想法:

  1. 如果计时器每隔一定时间更新UI,则绝对应该在viewDidAppear中启动它,并在viewDidDisappear中停止它。浪费资源来更新不可见的视图是没有意义的。

  2. 通过这样做,您也可以解决强大的参考周期。

  3. 关于“丢失”计时器值并从零开始,我们通常只会节省您要计数的时间或以后要重新计算的时间,并计算出必要的值。

    无论如何,我们这样做是因为您实际上不应该使用计时器来增加值,因为从技术上讲,您不能保证以期望的频率调用它们。

但是绝对不要浪费时间更新不再可见的UI。它不可扩展,并且会模糊用户界面(每五秒钟进行一次更新)中的模型(您要计数的或从中计数的)之间的区别。

© www.soinside.com 2019 - 2024. All rights reserved.