2017-07-25 30 views
0

我正在访问Firebase数据库并获取值并存储在属性中。当我尝试访问方法外的属性时,我得到“NULL”。任何人都可以帮助我这个我是新的OBJ C编程试图将Firebase中的值存储到NSDictionary中

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

    }]; 
} 
+0

你在哪里访问这个字典。粘贴更多代码。 –

回答

0

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

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

来源:Firebase Official Documentation

+0

非常感谢,它的工作。我修改我的代码以在执行完成时返回值并能够打印值。 – pradeep

0

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

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

可能是解决了这个问题。

0

对于使用你需要做的添加所有键一个一个,因为它会给你触发每个孩子的孩子加入观察员补充

注意这不会通知你对于您需要添加其他观察员的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; 
    }]; 
} 
相关问题