【问题标题】:Firestore listener delayed when coming from background in iOS来自iOS后台时的Firestore侦听器延迟
【发布时间】:2021-07-14 20:19:35
【问题描述】:

我正在运行一个简单的函数来查询orders 集合并添加一个快照侦听器,以便在查询中的文档发生更改时保持更新。

它在任何情况下都可以正常工作,除了用户将手机锁定在iOS 并返回应用程序的情况。

在这种情况下,当用户从后台返回应用程序时,大约需要 30 秒。让监听器再次激活并处理任何更改。

有谁知道为什么会发生这种情况? iOS 在应用程序从后台进入时是否有某种“唤醒”时间?

快照监听功能:

// function gets orders that are either in status "new" or "ready"
const getOrders = async () => {
  try {
    firebase
      .firestore()
      .collection("orders")
      .where("userId", "==", firebase.auth().currentUser.uid)
      .where("status", "in", ["new", "ready"])
      .onSnapshot((snapshot) => {
        if (!snapshot.empty) {
          let ordersArr = [];
          snapshot.forEach((order) => {
            ordersArr.push({ id: order.id, data: order.data() });
          });
          setOrders(ordersArr);
        } else {
          setOrders(null);
        }
      });
  } catch (error) {
    alert("Error getting orders");
  } finally {
    setLoading(false);
  }
};

【问题讨论】:

  • 你是否在应用进入后台时停用监听器,并在应用重新进入前台时重新激活它?
  • 不,我没有。是这个问题吗?
  • 很有可能。除非您的应用程序配置为在后台运行并且确实需要,否则侦听器不应侦听和更新未在屏幕上呈现的 UI。当应用重新进入前台并且您重新激活侦听器时,它将立即触发。
  • 感谢您的回复。您认为在进入后台时分离监听器/在前台启用它的最佳方法是什么?
  • 有多种方法可以检测应用何时进入后台。在应用范围内,您可以使用应用委托方法。 View-controller 特定的,你可以订阅相应的NotificationCenter 通知,例如UIApplication.willResignActiveNotification

标签: javascript ios firebase react-native google-cloud-firestore


【解决方案1】:

当应用程序进入后台 Detach a Listener

时,我能够通过分离 Firestore 侦听器来解决此问题

我能够通过使用Expo's AppState 实现这一目标

【讨论】:

  • 您是如何在保持清理退订功能的同时实现这一目标的?我正在尝试执行此操作,但是通过在应用程序处于活动状态时有条件地订阅,此功能无法撤回以取消订阅。另外,它还需要在组件卸载时仍然分离,所以仍然需要在 useEffect 之内。
  • 我能够使用 useRef() 钩子存储监听器。这样,当应用程序退回到后台时,我可以在 useEffecf() 的返回函数和 AppState 侦听器中取消订阅它。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多