我是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的值都等于Nil。如何从Firebase获取值,然后能够在其余代码中使用它们。如何从块中获取这些值?谢谢你们
答案 0 :(得分:0)
现在出现了问题:
array1 = [[NSarray alloc] initwithObjects:snapshot.value];
每次运行时,您都在块中初始化数组。
修复很容易
块外的(可能定义为属性,全局变量或__block)
@property NSMutableArray *myMutableArray = [NSMutableArray new];
块内的
[myMutableArray addObject: snapshot.value];
您可能忽略的一件事是.childAdded事件为每个子对象调用一次,然后为之后的任何新子对象调用。
因此,在这种情况下,如果父节点有三个与查询匹配的子节点,则该块将被调用三次,这就是我们在块中添加每个子节点的原因。
如果您想同时读入所有结果,可以使用.value然后迭代结果。
没有对错,这取决于你的用例。 (.value可能会读取数千个可能成为内存问题的结果。)
有关.childAdded和.value的详细信息,请参阅Firebase Retrieving Data。
哦 - 另外一张纸条。使用块内部检索到的块外的数据可能会非常棘手,因为块需要一些时间才能完成。因此,比方说,例如,您的互联网日期很糟糕且速度很慢 - 块之外的代码可能会在块有时间完成之前执行。因此,只有在知道块已完成时才会解决数据。 (例如,使用块内的数据,设置完成的标志或其他一些机制。在某些情况下.value使这更容易)。