Длительная операция Parse выполняется в главном потоке
Я получаю ошибку:
"Длительная операция Parse выполняется в главном потоке. Перерыв в warnParseOperationOnMainThread() для отладки."
а также
Msgstr "Сбой на 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:@" "];
}];
4 ответа
Это мягкое предупреждение для разработчиков, когда они делают вызовы Parse, которые блокируют основной поток.
Здесь вы можете увидеть, как все это происходит, добавить символическую точку останова на warnBlockingOperationOnMainThread
только если вы используете Parse API, выпущенный в 2015+. В противном случае, положить его на warnParseOperationOnMainThread
,
Эта функция прервется во время выполнения кода и покажет трассировку стека, которая должна помочь вам найти функцию блокировки.
Смотрите изображения ниже, чтобы лучше понять.
Для меня это случилось, когда я позвонил:
[[PFUser currentUser] refresh];
Решением было заменить его на:
[[PFUser currentUser] refreshInBackgroundWithBlock:nil];
Смотрите также этот ответ на сайте справки Parse.
Это происходит почти со всеми запросами Parse или сохранением данных. Во избежание этого есть возможность выполнять операции в фоновом режиме. На самом деле есть две альтернативы, одна - выполнять в фоновом режиме, а другая - выполнять в фоновом режиме с помощью блока кода.
Может быть, уже немного поздно, но вот, пожалуйста. Я думаю, что проблема заключается в том, что вы пытаетесь получить доступ к объектам одновременно:
[[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:@" "];
}];
И вуаля!