das*_*ist 7 asynchronous objective-c ios parse-platform
我做了以下测试类来尝试从Parse中检索数据:
-(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...
}
Run Code Online (Sandbox Code Playgroud)
根据代码中的注释部分,当我self.scoreDictionary在代码中打印时,它工作正常,我看到我的整个字典,因为它逐渐被填充.但是,在块结束后,当我再次打印字典时,它现在是空的.我仔细检查了查询API文档,但我仍然不确定我做错了什么.
Mik*_*ock 13
NSLog(@"The dictionary is %@", self.scoreDictionary)块完成后,最后一条语句实际上不会执行.它在findObjectsInBackgroundWithBlock方法返回后执行.findObjectsInBackgroundWithBlock大概是在一个单独的线程中运行某些东西,并且你的块实际上可能根本不会执行,直到最后一个NSLog语句之后的一段时间.从图形上看,这样的事情可能正在发生:
Thread 1
--------
retriveDataFromParse called
invoke findObjectsInBackgroundWithBlock
findObjectsInBackgroundWithBlock queues up work on another thread
findObjectsInBackgroundWithBlock returns immediately |
NSLog statement - self.scoreDictionary not yet updated |
retriveDataFromParse returns |
. V
. Thread 2, starting X milliseconds later
. --------
. findObjectsInBackgroundWithBlock does some work
. your block is called
. for-loop in your block
. Now self.scoreDictionary has some data
. NSLog statement inside your block
Run Code Online (Sandbox Code Playgroud)
您可能想要考虑一下,在检索到scoreDictionary数据后,您想对该怎么做?例如,您想要更新UI,调用其他方法等吗?您将希望在块内执行此操作,此时您知道已成功检索数据.例如,如果您有要重新加载的表视图,则可以执行以下操作:
for (PFObject *object in objects){
....
}
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUserInterfaceOrSomething];
});
Run Code Online (Sandbox Code Playgroud)
请注意dispatch_async- 如果更新数据后需要完成的工作涉及更改UI,则需要在主线程上运行.
| 归档时间: |
|
| 查看次数: |
6071 次 |
| 最近记录: |