Firebase FEventTypeChildAdded 回调被多次调用,用于同一个新对象

Posted

技术标签:

【中文标题】Firebase FEventTypeChildAdded 回调被多次调用,用于同一个新对象【英文标题】:Firebase FEventTypeChildAdded callback gets called multiple times for the same new object 【发布时间】:2015-02-22 20:34:19 【问题描述】:

我正在开发一个 ios 应用程序,并且我在 Firebase 的登录演示应用程序之上构建了我的项目。我可以通过 Facebook 进行身份验证,并与 Firebase 进行正常通信。当我按下注销按钮时,这是运行的代码:

- (void)logoutButtonPressed

     // logout of Firebase and set the current user to nil
     [self.simpleLogin logout];
     [self.ref unauth]; //Added this
     [self updateUIAndSetCurrentUser:nil];
     [self.items removeAllObjects];
     [self.tableView reloadData];

而且它似乎可以解决问题。一切都重置了,我的 tableView 被清除了。当我重新登录时,我得到了与我的 FB 凭据相关联的数据,它会填充并且一切都很好。我有一个 textField 和一个按钮,当我按下按钮时,textField 的文本会保存到 firebase 并在本地更新。

问题在我已经注销一次后尝试在我的简单字符串列表中创建一个新条目时出现。当我重新登录并尝试保存一个条目时,它会被保存到 firebase 一次(这是正确的),但我的回调被调用了两次!

[ref observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) 
            // Add the chat message to the array.
            if (![snapshot.value isEqual:[NSNull null]]) 
                [self.items addObject:snapshot.value[@"text"]];
            

            // Reload the table view so the new message will show up.
            [self.tableView reloadData];
         withCancelBlock:^(NSError *error) 
            NSLog(@"%@", error.description);
        ];

相同的对象快照在此块中出现两次,这意味着相同的对象被添加到数组和我的 tableView 中两次。如果我注销并重新登录,它会变得更加奇怪。第三次,出现了三个副本。第四次,四个项目,等等。这是我按下添加按钮时的代码:

- (IBAction)submitButtonPressed 
    if ([self.currentUser.provider isEqualToString:@"facebook"]) 
    Firebase *postRef = [[[self.ref childByAppendingPath:@"users"] childByAppendingPath:self.currentUser.uid] childByAppendingPath:@"posts"];

    NSString *statusText = [NSString stringWithFormat:@"Logged in as %@ (Facebook)",
                  self.currentUser.providerData[@"displayName"]];

    [[postRef childByAutoId] setValue:@@"name" : statusText, @"text": self.textField.text];
    

看来我可能没有完全退出 Firebase 或 FB,但我不知道还能尝试什么。

什么会导致同一个新对象多次调用 FEventTypeChildAdded 回调?

【问题讨论】:

【参考方案1】:

我从未使用过 Firebase iOS SDK,但它的工作方式很可能与其他 SDK 类似。

如果是这种情况,您注册的侦听器块将在用户注销时保持注册状态。然后当用户再次登录时,您正在注册第二个事件侦听器。所以从那一刻起,你的代码块将为每个添加的孩子执行两次。

您应该在用户注销 (https://www.firebase.com/docs/ios/api/#firebase_removeAllObservers) 时取消注册/取消事件侦听器,或者如果您之前已经注册过事件侦听器,则不再重新注册。

请参阅 iOS 版 Firebase 指南,特别是关于分离块的部分:https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-detaching

【讨论】:

谢谢!这就是问题所在。我可以发誓我通读了所有这些文档,看起来我错过了一些。非常感谢。我会尽快(16 小时)奖励赏金

以上是关于Firebase FEventTypeChildAdded 回调被多次调用,用于同一个新对象的主要内容,如果未能解决你的问题,请参考以下文章

无法解决:com.google.firebase:firebase-ml-vision:24.1.3;无法解决:com.google.firebase:firebase-core:20.0.2

没有创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()

如何修复 Firebase 9.0 导入错误? “尝试导入错误:‘firebase/app’不包含默认导出(导入为‘firebase’)。”

Firebase 持久化,清除 Firebase 缓存

Firebase 存储不会下载并添加到 firebase 数据库

将 Firebase 身份验证与 Firebase 数据库连接