iOS 应用程序在解析异步查询期间冻结
iOS App freezes during Parse Asynchronous Query
我正在使用后台异步调用在 Parse 中查询某些对象。但是,在进行查询时,应用程序会冻结。我无法与之互动。一旦查询完成并加载了对象,应用程序就会跟上。据我了解,应用程序应该在查询期间响应,因为它是后台异步任务。
例如,当应用程序加载查询时,查询开始 -> 如果我在查询过程中按回导航栏,什么也不会发生 -> 查询完成,我的对象出现 -> 应用程序弹出到根控制器对早期接触的回应
应用查询后未冻结。它反应正常。
我不确定问题是否出在我的查询位置,phone 解析时是否变慢,或者什么。任何帮助将不胜感激!!
相关代码:
-(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;
}
}];
}
您不应从后台线程更新 UI 元素。确保你的 loadNewImages
在主队列上调度 -
self.usersArray = objects;
dispatch_async(dispatch_get_main_queue(), ^{
[self loadNewImages];
self.queryingForUsers = NO;
});
为什么要为 self.usersQuery 设置 属性?你在其他地方使用它吗?我不知道你为什么要为查询设置 属性 因为我看不到你的其余代码,但是当你调用此查询时它可能会回溯导致应用程序混淆。通常不需要为解析查询设置 属性,但您可以尝试以下操作:
-(void)loadNewUsersAndAd{
PFQuery *usersQuery = [PFQuery queryWithClassName:@"UserObjects"];
[usersQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
//Other Code
}
else
{
//Other Code
}
}];
此外,Paulw11 是正确的,你不应该在后台线程中更新你的 UI 元素,即使添加他显示的代码现在不起作用,但这并不意味着它不是正确的。将它保留在您的项目中,因为它是正确的,您的问题存在于其他地方。
这里有很多变数,你如何显示图像,你是否一次显示它们,重复使用单元格等。看看你加载图像的实现,这很可能是你的问题。注释掉该行并从那里进行故障排除。如果它仍然滞后于注释掉的图像代码,那么您还有一个问题需要查找。
我正在使用后台异步调用在 Parse 中查询某些对象。但是,在进行查询时,应用程序会冻结。我无法与之互动。一旦查询完成并加载了对象,应用程序就会跟上。据我了解,应用程序应该在查询期间响应,因为它是后台异步任务。
例如,当应用程序加载查询时,查询开始 -> 如果我在查询过程中按回导航栏,什么也不会发生 -> 查询完成,我的对象出现 -> 应用程序弹出到根控制器对早期接触的回应
应用查询后未冻结。它反应正常。 我不确定问题是否出在我的查询位置,phone 解析时是否变慢,或者什么。任何帮助将不胜感激!!
相关代码:
-(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;
}
}];
}
您不应从后台线程更新 UI 元素。确保你的 loadNewImages
在主队列上调度 -
self.usersArray = objects;
dispatch_async(dispatch_get_main_queue(), ^{
[self loadNewImages];
self.queryingForUsers = NO;
});
为什么要为 self.usersQuery 设置 属性?你在其他地方使用它吗?我不知道你为什么要为查询设置 属性 因为我看不到你的其余代码,但是当你调用此查询时它可能会回溯导致应用程序混淆。通常不需要为解析查询设置 属性,但您可以尝试以下操作:
-(void)loadNewUsersAndAd{
PFQuery *usersQuery = [PFQuery queryWithClassName:@"UserObjects"];
[usersQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
//Other Code
}
else
{
//Other Code
}
}];
此外,Paulw11 是正确的,你不应该在后台线程中更新你的 UI 元素,即使添加他显示的代码现在不起作用,但这并不意味着它不是正确的。将它保留在您的项目中,因为它是正确的,您的问题存在于其他地方。
这里有很多变数,你如何显示图像,你是否一次显示它们,重复使用单元格等。看看你加载图像的实现,这很可能是你的问题。注释掉该行并从那里进行故障排除。如果它仍然滞后于注释掉的图像代码,那么您还有一个问题需要查找。