web-dev-qa-db-fra.com

Une opération d'analyse de longue durée est en cours d'exécution sur le thread principal

Je reçois l'erreur:

"Une opération d'analyse de longue durée est en cours d'exécution sur le thread principal. Interrompez l'opération sur warnParseOperationOnMainThread () pour déboguer."

et

"Break sur warnParseOperationOnMainThread () pour déboguer."

Je ne parviens pas à localiser l'erreur dans mon code. Est ce que quelqu'un peut me dire ce que je fais mal?

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

Il s’agit d’un léger avertissement à l’intention des développeurs lorsqu’ils passent les appels d’analyse qui bloqueraient le thread principal.

C'est là que vous pouvez voir que tout se passe, ajoutez un point d'arrêt symbolique sur warnBlockingOperationOnMainThread uniquement si vous utilisez une API Parse publiée à partir de 2015+. Sinon, mettez-le sur la warnParseOperationOnMainThread.

Cela va casser cette fonction pendant que vous exécutez votre code et vous montrer une trace de pile qui devrait vous aider à trouver la fonction de blocage.

Voir les images ci-dessous pour mieux comprendre.

enter image description here

enter image description here

55
Shamsudheen TK

Pour moi, cela s'est passé lorsque j'ai appelé:

[[PFUser currentUser] refresh];

La solution consistait à le remplacer par:

[[PFUser currentUser] refreshInBackgroundWithBlock:nil];

Voir aussi cette réponse sur le site d’Aide de Parse .

6
Kyle Clegg

Cela se produit presque avec toutes les requêtes d'analyse ou de sauvegarde des données. Pour éviter cela, il existe une option pour effectuer une opération en arrière-plan. En fait, il y a deux alternatives, l'une consiste à exécuter en arrière-plan et l'autre consiste à exécuter en arrière-plan avec un bloc de code. 

2
Pandurang Yachwad

Peut-être qu'il est un peu tard, mais c'est parti. Je pense que le problème vient du fait que vous essayez d'obtenir des objets à récupérer en même temps: 

[[PFUser currentUser] objectId];

et: 

 [query getObjectInBackgroundWithId...];

Il sera préférable d’obtenir d’abord le userId, tel que: 

//First fetch and store the id in a string so you can reuse it whenever you want
NSString *userId = [PFUser currentUser].objectId; 

Seconde: 

  // 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 voilà!

0
milguad