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:@" "];
}];
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 warnBlockingOperationOnMainThread
name__, wenn Sie eine Parse-API verwenden, die ab 2015+ freigegeben wurde. Andernfalls legen Sie es in die warnParseOperationOnMainThread
name__.
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.
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 .
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.
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!