主线程正在执行长时间运行的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瞧!