主线程正在执行长时间运行的Parse操作

我收到错误:

“主线程正在执行一个长时间运行的Parse操作,并打断warnParseOperationOnMainThread()进行debugging。

“打破warnParseOperationOnMainThread()来debugging。”

我无法find我的代码中的错误。 有人能告诉我我做错了什么吗?

PFQuery *query = [PFQuery queryWithClassName:@"User"]; [query getObjectInBackgroundWithId:[[PFUser currentUser] objectId] block:^(PFObject *object, NSError *error) { self.firstName = object[@"firstname"]; self.lastName = object[@"lastname"]; self.nameLabel.text = [[NSArray arrayWithObjects:self.firstName, self.lastName, nil] componentsJoinedByString:@" "]; }]; 

这是对开发者的一个温和的警告,当他们进行分析调用,将阻止主线程。

这是你可以看到这一切发生的地方,只有当你使用从2015+发布的Parse API时,才会在warnBlockingOperationOnMainThread上添加一个符号断点 。 否则,把它放在warnParseOperationOnMainThread

当你运行你的代码时,它会打破这个function,并且会向你显示一个堆栈跟踪,它可以帮助你find阻塞函数。

看到下面的图片有更好的理解。

在这里输入图像说明

在这里输入图像说明

对我来说,这发生在我打电话时:

 [[PFUser currentUser] refresh]; 

解决scheme是用下面的方法replace它:

 [[PFUser currentUser] refreshInBackgroundWithBlock:nil]; 

请参阅Parse帮助网站上的这个答案 。

它几乎所有的分析查询或数据保存。 它避免了这一点,有select在后台执行操作。 其实有两种select,一种是在后台执行,另一种是在后台执行代码块。

也许这有点迟,但是在这里你走了。 我认为这个问题来自于你试图同时获取对象的过程:

 [[PFUser currentUser] objectId]; 

和:

  [query getObjectInBackgroundWithId...]; 

首先得到userId会更好,比如:

 //First fetch and store the id in a string so you can reuse it whenever you want NSString *userId = [PFUser currentUser].objectId; 

第二:

  // Do your second fetch here: PFQuery *query = [PFQuery queryWithClassName:@"User"]; [query getObjectInBackgroundWithId:userId block:^(PFObject *object, NSError *error) { self.firstName = object[@"firstname"]; self.lastName = object[@"lastname"]; self.nameLabel.text = [[NSArray arrayWithObjects:self.firstName, self.lastName, nil] componentsJoinedByString:@" "]; }]; 

Et瞧!