iOS 应用程序在解析异步查询期间冻结

Posted

技术标签:

【中文标题】iOS 应用程序在解析异步查询期间冻结【英文标题】:iOS App freezes during Parse Asynchronous Query 【发布时间】:2015-01-08 23:34:52 【问题描述】:

我正在使用后台异步调用在 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;

    

];




【问题讨论】:

loadNewImages 是做什么的?它会更新 UI 元素吗?如果是,则应在主队列上调度 查询从 parse 加载一个 userObject,它有三张与之关联的图片。加载 userObject 后,我​​通过调用 loadNewImages 使用相关图片更新 UI。我在查询中包含此 UI 更新的问题是什么?如果是这样,我还能怎么做呢?感谢您到目前为止提示我! 【参考方案1】:

您不应该从后台线程更新 UI 元素。确保您的 loadNewImages 在主队列中分派 -

 self.usersArray = objects;
 dispatch_async(dispatch_get_main_queue(), ^
     [self loadNewImages];
     self.queryingForUsers = NO;
 );

【讨论】:

感谢您的回复!但是,这似乎无法解决问题。 那么您在某些代码中存在问题,此处未显示。您可以在调试器中尝试单步执行【参考方案2】:

为什么要为 self.usersQuery 设置一个属性?你在其他地方使用它吗?我不知道为什么您为查询设置了属性,因为我看不到您的其余代码,但是当您调用此查询时它可能会回溯,从而导致应用程序混乱。通常不需要为解析查询设置属性,但您可以尝试以下方法:

-(void)loadNewUsersAndAd
PFQuery *usersQuery = [PFQuery queryWithClassName:@"UserObjects"];
[usersQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) 
        //Other Code
    
    else 
    
       //Other Code

];

另外,Paulw11 是正确的,你不应该在后台线程中更新你的 UI 元素,即使添加他显示的代码现在不起作用,这并不意味着它不正确。将其保留在您的项目中,因为它是正确的,您的问题存在于其他地方。

这里有很多变量,你如何显示图像,你是否一次显示它们,重用单元格等。看看你加载图像的实现,这很可能是你的问题。注释掉该行并从那里进行故障排除。如果它仍然滞后于注释掉的图像代码,那么您还有一个问题需要寻找。

【讨论】:

感谢您的意见!很高兴能确认 Paulw 的回答,我很感激!我将逐步完成我的代码。此外,我将查询设为属性,因为我在另一个线程中调用 [self.usersQuery cancel] 以应对意外情况。也许这就是问题所在。

以上是关于iOS 应用程序在解析异步查询期间冻结的主要内容,如果未能解决你的问题,请参考以下文章

PWA 应用程序在 iOS 13.4 上的应用程序切换期间冻结

在 Tkinter 中执行函数期间程序冻结

应用程序因 FMDB 查询更新 ios 而冻结

特征检测期间 iOS Vision API“computeBlinkFunction”中的错误和冻结

在更新绑定源期间冻结 wpf 应用程序

RPC 调用期间 GWT 冻结