Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Firebase如何在块外部传递快照值/键_Ios_Objective C_Firebase - Fatal编程技术网

iOS Firebase如何在块外部传递快照值/键

iOS Firebase如何在块外部传递快照值/键,ios,objective-c,firebase,Ios,Objective C,Firebase,我对Firebase很陌生,但我开始喜欢它了。因此,我在将快照的值传递到块之外时遇到了问题 我想使用NSStrings和/或nsarray作为快照的值。这样我就可以在剩下的代码中使用它们 这是我的密码 NSString *string1; NSArray *array1; Firebase *usersRef = [fb childByAppendingPath:@"Parent name"]; FQuery *statesRef = [usersRef queryOrderedByChild

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

我想使用NSStrings和/或nsarray作为快照的值。这样我就可以在剩下的代码中使用它们

这是我的密码

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获取值,然后在代码的其余部分使用它们。如何从块中获取这些值?谢谢大家现在有问题了:

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

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

修理很容易

块外部(可能定义为属性、全局变量或_块)

街区内

[myMutableArray addObject: snapshot.value];
您可能还忽略了一件事。childAdded事件会为每个子对象调用一次,然后再为其后的任何新子对象调用一次

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

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

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

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


哦,还有一张纸条。处理在块内检索到的块外数据可能很棘手,因为块需要时间才能完成。比如说,你今天上网很糟糕,速度很慢——块外的代码可能在块完成之前就执行了。因此,只有当您知道块已完成时,才对数据进行寻址。(例如,处理块内的数据,设置完成标志或其他机制。在某些情况下,值使这更容易)。

嘿,谢谢。我在街区外工作很糟糕,但你推荐什么标志?因为在块外读取时,整数或字符串的值等于null。因此,如果在块内我将整数设置为1,那么在块外,整数的值将不等于1。那么你推荐什么样的标志机制呢?这很难,所以如果你没有答案,不用担心,我感谢你的帮助;定义块外的变量(如数组),然后在从Firebase返回数据时设置块内的值。比如说,;如果要将数组填充为tableView的数据源。定义块外的数组,按.value查询数据。然后对填充数组的快照(仍然在块中)进行迭代,然后在完成该迭代后刷新tableView。我不想要tableView。我真的需要弄清楚这一点。@user3352739提到tableView就是一个示例,说明了您可能希望在何处使用存储在数组中的数据。您的问题是关于用快照填充阵列的,答案演示了如何做到这一点。也许这不是你要问的?@user3352739也不清楚你将在哪里或如何处理块外的数据。例如你想读入一系列数字,然后把它们相加。您可以通过.value读取它们,迭代快照并将它们相加。这一切都可以在区块内完成。您还可以调用一个函数,从块内部将它们相加。也许进一步澄清这个问题将有助于我们帮助你们。
[myMutableArray addObject: snapshot.value];