webentwicklung-frage-antwort-db.com.de

Auf dem Hauptthread wird ein lang andauernder Parse-Vorgang ausgeführt

Ich erhalte den Fehler:

"Ein lang andauernder Parse-Vorgang wird im Hauptthread ausgeführt. Unterbrechen Sie warnParseOperationOnMainThread (), um zu debuggen."

und

"Unterbrechen Sie warnParseOperationOnMainThread () zum Debuggen."

Ich kann den Fehler nicht in meinem Code finden. Kann mir bitte jemand sagen, was ich falsch mache?

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

Dies ist eine sanfte Warnung an die Entwickler, wenn sie die Parse-Aufrufe durchführen, die den Haupt-Thread blockieren würden.

Hier können Sie sehen, wie alles passiert. Fügen Sie einen symbolischen Haltepunkt hinzu on warnBlockingOperationOnMainThreadname__, wenn Sie eine Parse-API verwenden, die ab 2015+ freigegeben wurde. Andernfalls legen Sie es in die warnParseOperationOnMainThreadname__.

Diese Funktion unterbricht die Funktion, während Sie Ihren Code ausführen, und zeigt Ihnen eine Stack-Ablaufverfolgung, die Ihnen helfen soll, die Blockierungsfunktion zu finden.

Sehen Sie sich die Bilder an, um ein besseres Verständnis zu erhalten.

enter image description here

enter image description here

55
Shamsudheen TK

Für mich passierte dies, als ich anrief:

[[PFUser currentUser] refresh];

Die Lösung bestand darin, es zu ersetzen durch:

[[PFUser currentUser] refreshInBackgroundWithBlock:nil];

Siehe auch diese Antwort auf der Parse-Hilfe-Site .

6
Kyle Clegg

Es passiert fast bei allen Parse-Abfragen oder beim Speichern von Daten. Dies wird vermieden, es besteht die Möglichkeit, die Bedienung im Hintergrund durchzuführen. Tatsächlich gibt es zwei Alternativen, eine ist im Hintergrund auszuführen und die andere wird im Hintergrund mit Codeblock ausgeführt. 

2

Vielleicht ist es ein bisschen spät, aber los gehts. Ich denke, das Problem rührt von der Tatsache her, dass Sie versuchen, Objekte gleichzeitig abzurufen: 

[[PFUser currentUser] objectId];

und: 

 [query getObjectInBackgroundWithId...];

Es ist besser, zuerst die userId zu bekommen, wie zum Beispiel: 

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

Zweite: 

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

0
milguad