【问题标题】:A long-running Parse operation is being executed on the main thread正在主线程上执行长时间运行的 Parse 操作
【发布时间】:2014-01-08 06:58:05
【问题描述】:

我收到错误:

“正在主线程上执行一个长时间运行的 Parse 操作。在 warnParseOperationOnMainThread() 上中断以进行调试。”

“中断 warnParseOperationOnMainThread() 进行调试。”

我无法在我的代码中找到错误。谁能告诉我我做错了什么?

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:@" "];
}];

【问题讨论】:

  • 这行PFQuery *query = [PFQuery queryWithClassName:@"User"]; 可能会阻塞主线程。

标签: ios objective-c parse-platform


【解决方案1】:

这是对开发人员发出会阻塞主线程的 Parse 调用时的温和警告。

在这里您可以看到这一切发生,仅当您使用从 2015 年起发布的 Parse API 时,才在 warnBlockingOperationOnMainThread 上添加一个符号断点。否则,把它放在warnParseOperationOnMainThread上。

它会在您运行代码时中断该函数,并向您显示一个堆栈跟踪,这将帮助您找到阻塞函数。

请参阅下面的图片以更好地理解。

【讨论】:

  • 对于2015+时代的任何人,您需要在符号断点中使用warnBlockingOperationOnMainThread,而不是warnParseOperationOnMainThread
  • 非常感谢您提供的信息。
  • 是否可以消除此警告?
【解决方案2】:

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

[[PFUser currentUser] refresh];

解决方案是将其替换为:

[[PFUser currentUser] refreshInBackgroundWithBlock:nil];

另见this answer on the Parse Help site

【讨论】:

  • +1 对我来说是[[PFInstallation currentInstallation] save]; vs [[PFInstallation currentInstallation] saveInBackground];,但想法相同。
【解决方案3】:

几乎所有 Parse 查询或数据保存都会发生这种情况。为了避免这种情况,可以选择在后台执行操作。实际上有两种选择,一种是在后台执行,另一种是在后台执行代码块。

【讨论】:

  • 欢迎。您能否提供有关替代方案的更多详细信息?
  • 例如保存数据: 1. saveInBackground 2. saveInBackgroundWithBlock 或从数据库中查询第一个对象: 1. query.getFirstObjectInBackgroud 2. query.getFirstObjectInBackgroudWithBlock
【解决方案4】:

也许有点晚了,但你走了。我认为问题出在您试图同时获取对象的事实:

[[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:@" "];
 }];

瞧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多