在后台暂停订阅 UI 更新并在前台重新启动?

Suspend subscription for UI updates in the background and restart it on foreground?

我有很多更新 UI 的订阅,但我想在应用进入后台时暂停它们,因为它们仍在触发和更新我的视图控制器的部分内容。

处理此问题以注意后台内存和不必要的 UI 更新的最佳方法是什么?

我想这取决于您的应用程序在后台执行的操作。

也许是:

  • 是不是timer/interval一直在走。
  • 尚未返回或已连接到 WebSocket 的 Observable 网络请求。
  • 一个 Observable 正在侦听系统事件,例如屏幕方向改变。

根据您关心的 Observable ,您可能希望以不同的方式处理它。对于网络请求的情况,您可能想要取消它,或者可能取消它然后在前台重新启动它。如果是像方向改变这样的系统事件,你可能只想在前台获取当前值。

无论如何,我不得不问,你为什么这么关心内存?我会说,让 iOS 处理系统内存问题。如果它决定终止您的应用程序,您的 Disposables 应该自行正确清理(如果您正确使用 DisposeBags)。然后,您应该只关心您的应用保持足够的状态,以便它可以从中断的地方继续(在正确的页面上等)。我不建议尝试代表 iOS 进行过度优化。只要 iOS 允许,就让您的应用保留 运行。您的用户可能只是跳到另一个应用程序一秒钟左右。

UIApplicationDelegate(即您的 AppDelegate.swift)有一些值得实施的有用方法,可以让您接近您正在寻找的东西

尝试实施这些:

func applicationDidEnterBackground(application: UIApplication) {

    // Do something to notify your services to unsubscribe
}

func applicationWillEnterForeground(application: UIApplication) {

   // Do something to resubscribe for notification and also catch up for anything you missed while in the background
}    

可能值得再阅读 UIApplicationDelegate 并了解所有可能的状态,例如 'Active' 和 'Inactive',但这应该会让您朝着正确的方向前进 https://developer.apple.com/reference/uikit/uiapplicationdelegate