2014-01-08 3 views
24

я получаю ошибку:продолжительная операция Разбора выполняются в основном потоке

"A long-running Parse operation is being executed on the main thread. Break on warnParseOperationOnMainThread() to debug."

и

"Break on warnParseOperationOnMainThread() to debug."

Я не может найти ошибку в своем коде. Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно?

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

Возможно, эта строка 'PFQuery * query = [PFQuery queryWithClassName: @" User "];' является долговременной работой, которая блокирует основной поток. – KudoCC

ответ

54

Это нежное предупреждение для разработчиков, когда они делают вызовы Parse, которые блокируют основной поток.

Здесь вы можете увидеть все это, добавьте символическую точку останова на warnBlockingOperationOnMainThread, только если вы используете API-интерфейс Parse, выпущенный с 2015 года. В противном случае, положите его на warnParseOperationOnMainThread.

Он будет разбит на эту функцию во время запуска вашего кода и покажет вам трассировку стека, которая поможет вам найти функцию блокировки.

Чтобы получить лучшее представление, ознакомьтесь с фотографиями ниже.

enter image description here

enter image description here

+6

Для всех здесь, в эпоху 2015+, вам нужно использовать 'warnBlockingOperationOnMainThread' в символической точке останова вместо' warnParseOperationOnMainThread'. – Mike

+1

Большое спасибо за информацию. –

+0

Можно ли отключить это предупреждение? –

6

Для меня это случилось, когда я назвал:

[[PFUser currentUser] refresh]; 

Решение было заменить его:

[[PFUser currentUser] refreshInBackgroundWithBlock:nil]; 

Смотрите также this answer on the Parse Help site.

+1

+1 Для меня это было '[[PFInstallation currentInstallation] save];' vs '[[PFInstallation currentInstallation] saveInBackground];', но та же идея. – Olie

0

Возможно, это немного поздно, но здесь вы идете. Я думаю, что проблема исходит из того, что вы пытаетесь добраться до объектов выборки одновременно:

[[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!

2

Это почти происходит со всеми запросами Parse или с сохранением данных. Он избегает этого, есть возможность выполнить операцию в фоновом режиме. На самом деле есть две альтернативы: одна должна выполняться в фоновом режиме, а другая - в фоновом режиме с блоком кода.

+0

Добро пожаловать. Можете ли вы предоставить более подробную информацию об альтернативах? – mins

+0

Например, для сохранения данных: 1. saveInBackground 2. saveInBackgroundWithBlock или запросить первый объект из базы данных: 1. query.getFirstObjectInBackgroud 2. query.getFirstObjectInBackgroudWithBlock –

Смежные вопросы