【问题标题】:trying to store values from Firebase to NSDictionary试图将值从 Firebase 存储到 NSDictionary
【发布时间】:2017-07-26 12:50:22
【问题描述】:

我正在访问 firebase 数据库并获取值并存储在属性中。当我尝试访问方法之外的属性时,我得到“NULL”。谁能帮我解决这个问题我是 obj c 编程的新手

-(void)buildUsersInDatabase {
     FIRDatabaseReference *referenceToDatabase = [[FIRDatabase database]reference];
    [[referenceToDatabase child:@"Users"]observeEventType: FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
        self.dict = @{@"Name": snapshot.value[@"Name"],
                               @"Email":snapshot.value[@"Email"]};

    }];
}

【问题讨论】:

  • 您在哪里访问这本词典。粘贴更多代码。

标签: ios objective-c firebase firebase-realtime-database


【解决方案1】:

方法-[FIRDatabaseReference observeEventType:withBlock:]是异步的;当观察到的事件发生时,块中的代码将被执行。

相比之下,您的方法-buildUsersInDatabase 只是注册块并立即退出; self.dict 将是 nil 直到观察到的事件发生并且实际执行了被传递的块。

来源:Firebase Official Documentation

【讨论】:

  • 非常感谢,它成功了。我修改了我的代码以在执行完成并能够打印值时返回值。
【解决方案2】:

这个问题有点不完整。 尝试使用 NSMutableDictionary

self.dict = [[NSMutableDictionary alloc] init];
[self.dict setObject:snapshot.value[@"Name"] forKey:@"Name"];
[self.dict setObject:snapshot.value[@"Email"] forKey:@"Email"];

也许这可以解决问题。

【讨论】:

    【解决方案3】:

    要使用添加的子观察者,您需要一一添加所有键,因为它会触发每个添加的子项

    注意这不会通知您任何孩子的价值变化,因为您需要使用 FIRDataEventTypeChildChanged

    为 valueChanged 添加另一个观察者
    -(void)buildUsersInDatabase {
        FIRDatabaseReference *referenceToDatabase = [[FIRDatabase database]reference];
        [[referenceToDatabase child:@"Users"]observeEventType: FIRDataEventTypeChildAdded withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
            if (!self.dict){
                self.dict = [NSMutableDictionary new];
            }
            [self.dict setObject:snapshot.value forKey:snapshot.key];
    
        }];
    }
    

    如果你希望你也可以使用 value 事件,当值改变时,它会给你整个字典在那个孩子...

    -(void)buildUsersInDatabase {
        FIRDatabaseReference *referenceToDatabase = [[FIRDatabase database]reference];
        [[referenceToDatabase child:@"Users"]observeEventType: FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
            if (!self.dict){
                self.dict = [NSMutableDictionary new];
            }
            self.dict = snapshot.value;
        }];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-18
      • 2019-03-10
      • 2014-07-17
      • 2020-04-01
      • 2021-10-14
      相关资源
      最近更新 更多