ios - 为同一个新对象多次调用 Firebase FEventTypeChildAdded 回调

标签 ios objective-c facebook authentication firebase

我正在开发一个 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);
        }];

同一对象快照在此 block 中出现两次,这意味着相同的对象被两次添加到数组和我的 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 回调?

最佳答案

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

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

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

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

关于ios - 为同一个新对象多次调用 Firebase FEventTypeChildAdded 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28662913/

相关文章:

ios - 使用 Storyboard在 Xcode 6.1.1 中展开 Segue

ios - 在 iOS 上设置独立于设备的 RGB

ios - 如何在 Swift 中调整图像大小?

ios - [C4]声像识别器和 slider 之间的冲突

iphone - iPad 上间歇性卡住

ios - 嵌套在 Objective-C 中的每个循环

ios - 如何更改现有背景颜色的 Alpha channel

ios - Facebook iOS Safari 身份验证

facebook - 在 fancybox 共享按钮中动态更改 facebook og 图像

ios - 管理登录 IOS App 的用户