2016-03-18 15 views
0

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

我想使用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获取值,然后在整个代码中使用它们。我怎样才能将这些值从块中取出?感谢你们

回答

0

现在有你的问题:

阵列1 = [[NSArray的页头] initwithObjects:snapshot.value]。

您每次运行时都在块中初始化阵列。

定影容易

块(也许是定义为一个属性,全局变量或__block)

@property NSMutableArray *myMutableArray = [NSMutableArray new]; 

块内

[myMutableArray addObject: snapshot.value]; 

有一件事你也可眺望外面是为每个子对象调用一次.childAdded事件,然后再调用任何新的子对象。

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

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

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

有关.childAdded和.value的详细信息,请参阅Firebase Retrieving Data

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

+0

嘿周杰伦谢谢。这很糟糕,我在这个街区之外工作,但是你推荐什么旗帜?因为在块外读取时整数或字符串的值等于null。所以如果在块内我设置整数等于1,在整数值不等于1的块之外。那么你推荐什么标记机制?如果你没有答案,这很难,所以不用担心,我很感激帮助。 – user3352739

+0

你的评论更多的是一个迅速/ objc的问题,并在我的答案回答;定义块外的变量(如数组),然后在从Firebase返回数据时设置块内的值。举例来说,如果你想填充一个数组作为tableView的dataSource。在块外定义数组,通过.value查询数据。然后迭代填充数组的快照(仍在块中),然后在完成该迭代时刷新tableView。 – Jay

+0

我不想要一个tableview。我真的需要弄清楚这一点。 – user3352739