【发布时间】:2020-08-30 12:24:52
【问题描述】:
我有UITabBarController,在其中一个UIViewController 中,我使用Timer 每5 秒滚动一次UICollectionView。这是我如何做的简短代码:
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