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

时间:2016-03-18 22:13:43

标签: ios objective-c firebase

我是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获取值,然后能够在其余代码中使用它们。如何从块中获取这些值?谢谢你们

1 个答案:

答案 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使这更容易)。