我使用后台异步调用查询Parse的某些对象。但是,当查询发生时,应用程序冻结。我无法与之互动。完成查询并加载对象后,应用程序就会赶上。我的理解是应用程序应该在查询期间响应,因为它是后台异步任务。
例如,当应用加载查询开始时 - >如果我在查询期间按下导航栏,则没有任何反应 - >查询结束,我的对象出现 - >应用程序弹出到根控制器以响应之前的触摸
查询后应用程序未冻结。它正常响应。 我不确定问题是我的查询位置,手机在解析时会变慢,或者是什么。任何帮助将不胜感激!!
相关代码:
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//Loads the users to be rated
[self loadNewUsersAndAd];
}
-(void)loadNewUsersAndAd{
self.usersQuery = [PFQuery queryWithClassName:@"UserObjects"];
[self.usersQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
self.queryingForUsers = YES;
if (error) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Sorry!" message:@"It looks like we couldn't update your current games! Make sure you're connected to the internet." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alertView show];
self.queryingForUsers = NO;
}
else
{
//The query was successful
self.usersArray = objects;
[self loadNewImages];
self.queryingForUsers = NO;
}
}];
}
答案 0 :(得分:2)
您不应该从后台线程更新UI元素。确保在主队列中分派loadNewImages
-
self.usersArray = objects;
dispatch_async(dispatch_get_main_queue(), ^{
[self loadNewImages];
self.queryingForUsers = NO;
});
答案 1 :(得分:0)
为什么要为self.usersQuery设置属性?你在其他地方使用它吗?我不知道为什么你有一个查询的属性集,因为我看不到你的其余代码,但是当你调用这个查询导致混淆应用程序时,它可能会回溯。通常不需要为解析查询设置属性,但您可以尝试以下操作:
-(void)loadNewUsersAndAd{
PFQuery *usersQuery = [PFQuery queryWithClassName:@"UserObjects"];
[usersQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
//Other Code
}
else
{
//Other Code
}
}];
此外,Paulw11是正确的,您不应该在后台线程中更新您的UI元素,即使添加他显示的代码现在也不起作用,这并不意味着它不正确。保留在项目中因为它是正确的,您的问题存在于其他地方。
这里有很多变量,你如何显示图像,你是否一次显示它们,重复使用单元格等。看看你的实现加载图像,这很可能是你的问题。从那里注释掉该行并进行故障排除。如果它仍然滞后于图像代码已注释掉,则还有其他问题需要查找。