Ios findObjectsInBackgroundWithBlock:从解析中获取数据,但数据仅存在于块内
我制作了以下测试类来尝试从解析中检索数据:Ios findObjectsInBackgroundWithBlock:从解析中获取数据,但数据仅存在于块内,ios,objective-c,asynchronous,parse-platform,Ios,Objective C,Asynchronous,Parse Platform,我制作了以下测试类来尝试从解析中检索数据: -(void)retrieveDataFromParse { PFQuery *query = [PFQuery queryWithClassName:@"TestObject"]; [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if(!error){ for (PFObject *ob
-(void)retrieveDataFromParse
{
PFQuery *query = [PFQuery queryWithClassName:@"TestObject"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if(!error){
for (PFObject *object in objects){
NSString *nameFromObject = [NSString stringWithFormat:@"%@", [object objectForKey:@"Name"]];
NSString *dateFromObject = [NSString stringWithFormat:@"%@", [object createdAt]];
NSString *scoreFromObject = [NSString stringWithFormat:@"%@", [object objectForKey:@"Score"]];
[self addNewScore:scoreFromObject andDate:dateFromObject forUserName:nameFromObject];
NSLog(@"The dictionary is %@", self.scoreDictionary); //<-- here it works printing out the whole dictionary
}
} else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
NSLog(@"The dictionary is %@", self.scoreDictionary); //<- but after the block is called, here the dictionary is again empty...
}
-(void)retrieveDataFromParse
{
PFQuery*query=[PFQuery queryWithClassName:@“TestObject”];
[查询findObjectsInBackgroundWithBlock:^(NSArray*对象,NSError*错误){
如果(!错误){
用于(PFObject*对象中的对象){
NSString*nameFromObject=[NSString stringWithFormat:@“%@,[object objectForKey:@“Name]”;
NSString*dateFromObject=[NSString stringWithFormat:@“%@,[object createdAt]];
NSString*scoreFromObject=[NSString stringWithFormat:@“%@,[object objectForKey:@“Score”];
[self-addNewScore:scoreFromObject和Date:dateFromObject for用户名:nameFromObject];
NSLog(@“字典是%@”,self.scoreDictionary);/最后一个NSLog(@“字典是%@”,self.scoreDictionary)
语句在块完成后不会实际执行。它在FindObjectsInBackgroundithBlock
方法返回后执行。FindObjectsInBackgroundithBlock
可能在单独的线程中运行某些内容,并且在最后一个NSLog状态之后的某段时间内,块可能根本不会实际执行从图形上看,类似这样的事情可能正在发生:
线程1
--------
调用RetrieveDataFromParse
调用findObjectsInBackgroundWithBlock
findObjectsInBackgroundWithBlock将另一个线程上的工作排队
findObjectsInBackgroundWithBlock立即返回|
NSLog语句-self.scoreDictionary尚未更新|
RetrieveDataFromParse返回|
v
.线程2,X毫秒后开始
. --------
.findObjectsInBackgroundWithBlock做了一些工作
.你的街区叫
.在你的街区里循环
.现在self.scoreDictionary有一些数据
块中的.NSLog语句
您可能会想一想,在检索到scoreDictionary数据后,您想对它做什么?例如,您想更新UI、调用其他方法等吗?您想在块内执行此操作,此时您知道数据已成功检索。例如,如果您有一个选项卡要重新加载的视图,可以执行以下操作:
for (PFObject *object in objects){
....
}
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUserInterfaceOrSomething];
});
请注意dispatch\u async
-如果更新数据后需要执行的工作涉及更改UI,则需要在主线程上运行该UI。最后一个NSLog(@“dictionary is%@”,self.scoreDictionary)
在完成块执行之前执行。到那时,self.scoreDictionary
肯定会为空
此外,完成块将在主线程上执行。您可以参考以下链接
非常感谢,特别是非常有用的螺纹说明!