尝试将值从 Firebase 存储到 NSDictionary



我正在访问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"]};
}];
}

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

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

来源:Firebase 官方文档

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

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

也许这解决了问题。

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

注意这不会通知您任何子项的值更改,因为您需要为 valueChanged 添加另一个观察程序,使用FIRDataEventTypeChildChanged

-(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];
}];
}

如果你愿意,你也可以使用值事件,每当值发生变化时,它都会给你整个字典......

-(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;
}];
}

最新更新