iOS Firebase如何在Block之外传递快照值/密钥

我对Firebase真的很陌生,但我开始喜欢它。 所以我在将快照的值传递给块之外时遇到问题。

我想使用NSStrings和/或NSarrays成为快照的价值。 所以我可以在我的其他代码中使用它们。

这是我的代码

NSString *string1; NSArray *array1; Firebase *usersRef = [fb childByAppendingPath:@"Parent name"]; FQuery *statesRef = [usersRef queryOrderedByChild:@"email"]; FQuery *specificStateRef = [statesRef queryEqualToValue:@"user name"]; [specificStateRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { //NSLog(@"snapshot: %@", snapshot); NSLog(@" key: %@", snapshot.key); NSLog(@" value: %@", snapshot.value); //HELP ME HERE array1=[[NSarray alloc]initwithObjects:snapshot.value]; string1=snapshot.key; }]; 

所以如果我写的话就在这个块之外。

  NSLog(@" String1 = %@", string1); NSLog(@" Array1 = %@", array1); 

不幸的是,string1和array1的值都等于零。 如何从Firebase获取值,然后在整个代码中使用它们。 我怎样才能从这个区块中获得这些值? 谢谢你们

现在有你的问题:

array1 = [[NSarray alloc] initwithObjects:snapshot.value];

每次运行时,您都在块中初始化您的数组。

修复很容易

在块之外(也许定义为属性,全局variables或__block)

 @property NSMutableArray *myMutableArray = [NSMutableArray new]; 

在块内

 [myMutableArray addObject: snapshot.value]; 

你也可能忽略的一件事情是,为每个子对象调用一次.childAdded事件,然后再调用任何新的子对象。

所以在这种情况下,如果父节点有三个与查询相匹配的子节点,则该块将被调用三次,这就是为什么我们在块内添加每个子节点的原因。

如果要同时读取所有结果,可以使用.value,然后遍历结果。

没有对错,这取决于你的使用情况。 (.value可能会读取数以千计的可能成为内存问题的结果。)

有关.childAdded和.value的详细信息,请参阅Firebase检索数据 。

哦 – 另一个音符。 处理在块内检索的块之外的数据可能会非常棘手,因为该块需要花费时间来完成。 举个例子,比如说,互联网日子不好,你的速度很慢 – 块之外的代码可能会在块有时间完成之前执行。 所以只有当你知道块已经完成时才能处理数据。 (例如,使用块内的数据,设置完成的标志或其他机制,在某些情况下.value使这更容易)。