На главном потоке выполняется длительная работа 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:@" "];
}];
Ответы
Ответ 1
Это нежное предупреждение разработчикам, когда они вызывают вызовы Parse, которые блокируют основной поток.
Здесь вы можете увидеть все это, добавьте символическую точку останова на warnBlockingOperationOnMainThread
, только если вы используете API-интерфейс Parse, выпущенный с 2015 года. В противном случае поставьте его на warnParseOperationOnMainThread
.
Он будет разбит на эту функцию во время запуска вашего кода и покажет вам трассировку стека, которая поможет вам найти функцию блокировки.
См. изображения ниже, чтобы лучше понять.
![enter image description here]()
![enter image description here]()
Ответ 2
Для меня это произошло, когда я позвонил:
[[PFUser currentUser] refresh];
Решение заключалось в том, чтобы заменить его на:
[[PFUser currentUser] refreshInBackgroundWithBlock:nil];
См. также этот ответ на странице справки по партированию.
Ответ 3
Это почти происходит со всеми запросами Parse или с сохранением данных. Он избегает этого, есть возможность выполнить операцию в фоновом режиме. На самом деле есть две альтернативы: одна должна выполняться в фоновом режиме, а другая - в фоновом режиме с блоком кода.
Ответ 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:@" "];
}];
Et voila!