我有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(即使它不可见)?
一些想法:
如果计时器每隔一定时间更新UI,则绝对应该在viewDidAppear
中启动它,并在viewDidDisappear
中停止它。浪费资源来更新不可见的视图是没有意义的。
通过这样做,您也可以解决强大的参考周期。
关于“丢失”计时器值并从零开始,我们通常只会节省您要计数的时间或以后要重新计算的时间,并计算出必要的值。
无论如何,我们这样做是因为您实际上不应该使用计时器来增加值,因为从技术上讲,您不能保证以期望的频率调用它们。
但是绝对不要浪费时间更新不再可见的UI。它不可扩展,并且会模糊用户界面(每五秒钟进行一次更新)中的模型(您要计数的或从中计数的)之间的区别。