【问题标题】:Firebase withCompletionBlock not called if there is no connection如果没有连接,则不会调用 Firebase withCompletionBlock
【发布时间】:2013-12-25 13:14:23
【问题描述】:

我正在使用以下内容:

Firebase *fb =[[Firebase alloc] initWithUrl:url];
            [fb setValue:d withCompletionBlock:^(NSError *error, Firebase *ref) {
                if (error) {
                    // bad news
                } else {

                }
            }];

如果您有连接,这似乎工作得很好,如果没有,似乎永远不会调用回调。如果是这种情况,我是否需要将整个内容包装在connectedRef 中?当我猜测完成块会因错误状态不在线而失败时,似乎需要做很多额外的工作。

还有其他人有这个问题吗?

【问题讨论】:

  • 我相信当Firebase以离线模式启动时,你需要调用一个值为null的set op。我对这里的细节并不坚定,但这应该会启动 init。此外,在最新版本中添加了完整的离线持久性:groups.google.com/forum/#!topic/firebase-talk/dOocEtjQz4w
  • 这是一种让您的观察者在您不在线时触发事件的技术。除非有来自服务器或本地 setValue 调用的数据,否则观察者不会触发,因此有时执行 setValue 来让观察者触发是有意义的。但你通常不需要这个。

标签: ios firebase


【解决方案1】:

Firebase 背后的理念是为您同步数据。它不仅仅是一个简单的请求/响应系统。因此,如果您在离线时执行 setValue,Firebase 将保留该数据,直到您在线,然后它会在那时执行 setValue(然后将调用完成块)。

所以你看到的行为是预期的。如果您只想在在线时执行 setValue,那么是的,您需要使用 .info/connected 观察者。但是,如果您在尝试执行 setValue 或类似的操作时离线,您仍然可能会遇到问题。一般来说,最好只执行 setValue 并让 Firebase 为您处理。

【讨论】:

  • Michael,这种行为在所有平台上是否一致?我以为你在javascript中调用set API的那一刻,即使你离线,也会立即调用本地回调。
  • 我们可能在谈论不同的事情。事件回调(即使用 .on 注册)在 set() 调用时立即被调用,但 set() onComplete 回调在 set 到达服务器之前不会被调用。这应该在所有平台上保持一致。
  • 一旦连接恢复,值会更新到服务器,但不会调用完成块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多