Ios 如果没有连接,则不调用Firebase withCompletionBlock

Ios 如果没有连接,则不调用Firebase withCompletionBlock,ios,firebase,Ios,Firebase,我正在使用以下工具: Firebase *fb =[[Firebase alloc] initWithUrl:url]; [fb setValue:d withCompletionBlock:^(NSError *error, Firebase *ref) { if (error) { // bad news } else { }

我正在使用以下工具:

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

                }
            }];
如果你有一个连接,这似乎很有效,如果没有,回调似乎永远不会被调用。如果是这样的话,我是否需要将整个内容包装在一个
connectedRef
中?似乎有很多额外的工作,当我猜完成块将失败,错误状态为not online时


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

Firebase背后的想法是为您同步数据。它不仅仅是一个简单的请求/响应系统。因此,如果您在脱机时执行设置值,Firebase将保留该数据,直到您联机,然后它将在那时执行设置值(然后调用完成块)


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

我认为当Firebase以脱机模式启动时,您需要调用值为null的
set
op。我对这里的细节不太确定,但这应该是一个开始。此外,最新版本中添加了完全脱机持久性:这是一种让您的观察者在您不在线时触发事件的技术。除非观察者有来自服务器或本地setValue调用的数据,否则观察者不会激发,因此有时执行setValue以激发观察者是有意义的。但是你通常不需要这样。Michael,这种行为在所有平台上都是一致的吗?我认为在javascript中调用SETAPI的那一刻,即使您处于脱机状态,也会立即调用本地回调。我们可能会讨论不同的事情。set()调用会立即调用事件回调(即注册为.on),但set()onComplete回调在set发送到服务器之前不会被调用。这应在所有平台上保持一致。一旦连接恢复,这些值将更新到服务器,但不会调用完成块。