【问题标题】:Is it bad practice to modify view after viewDidDisappear called?在调用 viewDidDisappear 之后修改视图是不好的做法吗?
【发布时间】: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


    【解决方案1】:

    一些想法:

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

    2. 通过这样做,您也可以解决强引用循环问题。

    3. 就“丢失”您的计时器值并从零开始而言,我们通常只会保存您从或到的时间,并在稍后重新启动计时器时计算必要的值。

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

      说了这么多,我不知道在这个例子中你担心失去什么计时器“价值”。

    但绝对不要浪费时间更新不再可见的 UI。它不可扩展,并且模糊了模型(您计数的对象)与 UI(每五秒发生一次的更新)之间的区别。

    【讨论】:

    • 好的,你写了There’s no point in wasting resources updating a view that is not visible. 我接受这一点,但让我写一些例子:我的标签栏中有5个屏幕,其中一个我发出网络请求,然后立即点击另一个标签。以前屏幕的视图不再可见,但在完成网络请求后,iOS 可以根据需要修改 UI。允许 iOS 这样做可以吗?
    • 当然,在那个特定的例子中。我可能会让请求完成并更新 UI。但我也要确保使用weak 引用,这样网络请求就不会保持对视图控制器的强引用,而是确保只有标签栏控制器在这样做。但是重复计时器、显示链接、非常复杂的动画等等,不,我会取消它们作为一般准则。
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多