我正在使用此findAllMessages()函数返回一个NSString,其中包含有关每条消息的信息。 一切顺利,直到我走出块并且concatenatedMessage字符串为空。
最后三行concatenatedMessage返回null:
projectId
如何在块外部访问concatenatedMessage的值,以便concatenatedMessage不为null?
NSLog(@"%@",concatenatedMessage);
NSString *newString = concatenatedMessage;
return newString;
谢谢!
答案 0 :(得分:3)
您尝试使用同步函数(observeEventType:withBlock:
)包装异步函数(findAllMessages
)。
这不起作用。这似乎是每种现代语言中的一个问题。
你可以:
FIRDatabaseQuery
上找到一个同步方法并调用它(不要从主线程执行此操作,否则您将阻止UI)findAllMessages
更改为异步(findAllMessagesWithBlock:
)并通过块返回调用方。您可能还需要将调用者修改为异步。 Async有一种方法可以接管使用它的大部分代码库。答案 1 :(得分:1)
我认为您误解了该块是如何工作的。让我详细说明一下:
您对块上方concatenatedMessage
的定义是正确的。做一些类似于你所做的事情,你可以在块内外访问它:
__block NSString *concatenatedMessage;
这里的关键是要理解,传递到...withBlock:^(FIRDataSnapshot *snapshot) {
的块很可能不会立即执行,因为块是异步的。
话虽这么说,当您在块之后在代码中记录concatenatedMessage
时,块尚未执行,因此字符串isn&#39改变了。
相反,你应该做的是: