Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.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 findObjectsInBackgroundWithBlock:从解析中获取数据,但数据仅存在于块内_Ios_Objective C_Asynchronous_Parse Platform - Fatal编程技术网

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
肯定会为空

此外,完成块将在主线程上执行。您可以参考以下链接


非常感谢,特别是非常有用的螺纹说明!