__block变量返回null。如何访问__block变量中的NSString?

时间:2016-06-16 22:34:50

标签: ios objective-c firebase

我正在使用此findAllMessages()函数返回一个NSString,其中包含有关每条消息的信息。 一切顺利,直到我走出块并且concatenatedMessage字符串为空。

最后三行concatenatedMessage返回null:

projectId

如何在块外部访问concatenatedMessage的值,以便concatenatedMessage不为null?

 NSLog(@"%@",concatenatedMessage);
 NSString *newString = concatenatedMessage;
 return newString;

谢谢!

2 个答案:

答案 0 :(得分:3)

您尝试使用同步函数(observeEventType:withBlock:)包装异步函数(findAllMessages)。

这不起作用。这似乎是每种现代语言中的一个问题。

你可以:

  1. FIRDatabaseQuery上找到一个同步方法并调用它(不要从主线程执行此操作,否则您将阻止UI)
  2. findAllMessages更改为异步(findAllMessagesWithBlock:)并通过块返回调用方。您可能还需要将调用者修改为异步。 Async有一种方法可以接管使用它的大部分代码库。

答案 1 :(得分:1)

我认为您误解了该块是如何工作的。让我详细说明一下:

您对块上方concatenatedMessage的定义是正确的。做一些类似于你所做的事情,你可以在块内外访问它

__block NSString *concatenatedMessage;

这里的关键是要理解,传递到...withBlock:^(FIRDataSnapshot *snapshot) {的块很可能不会立即执行,因为块是异步的

话虽这么说,当您在块之后在代码中记录concatenatedMessage时,块尚未执行,因此字符串isn&#39改变了。

相反,你应该做的是:

  1. 不使用块(使用像普通函数一样的同步)
  2. 执行内部所需的任何内容,以便在最终执行时,您的代码执行完毕后变量已设置