3 Stimmen

Haben NSNotificationCenter-Benachrichtigungen eine höhere Priorität als UITableView-Zellenladeereignisse?

Werden Ereignisse, die von NSNotificationCenter postNotificationName veröffentlicht werden, vor UI-Aktualisierungsereignissen verarbeitet?

Ich muss das wissen, weil mein aktuelles Programm sonst in einigen seltenen Fällen abstürzt.

Modell-Code:

- (void)searchFinishedWithResults:(Results *)results {
    self.results = results;
    // If some table cells are loaded NOW, before notication is processed, we might crash!
    [[NSNotificationCenter defaultCenter]
     postNotificationName:SearchResultArrived object:nil];    
}

Bei der Verarbeitung der Meldung werde ich UITableView reloadData ausführen.

Bedenken Sie jedoch, dass die Benutzeroberfläche vor der Bearbeitung der Meldung aktualisiert werden muss. In diesem Fall wird -tableView:cellForRowAtIndexPath:indexPath aufgerufen, aber das Ergebnisobjekt hat sich geändert, es werden alte Daten abgerufen.

5voto

Adrian Kosmaczewski Punkte 7921

Die Benachrichtigungen werden genau dann versandt, wenn Sie postNotification: oder postNotificationName:object: aufrufen, und zwar synchron, ein Beobachter nach dem anderen (in keiner bestimmten Reihenfolge). In dem von Ihnen gezeigten Fall würden sie genau nach der Zuweisung der Variablen "results" und vor Beendigung der Methode gesendet werden.

2voto

Georg Schölly Punkte 120083

Direkt von Apples Dokumentation zum NSNotificationCenter :

Ein Benachrichtigungszentrum liefert Benachrichtigungen an Beobachter synchron. Mit anderen Worten, die postNotification: Methoden kehren nicht zurück, bis alle Beobachter die die Benachrichtigung erhalten und verarbeitet Benachrichtigung erhalten und verarbeitet haben.

So senden Sie Benachrichtigungen asynchron verwenden Sie NSNotificationQueue.

0voto

TechZen Punkte 64117

Nebenbei bemerkt denke ich, dass Sie Ihr Design überdenken sollten. Es klingt wie Sie nicht genügend Trennung zwischen der Ansicht und dem Modell haben.

Ihr Datenmodell sollte wissen, was alte Daten sind und was nicht, und sollte nur aktuelle Daten an den tableViewController zurückgeben. Das Datenmodell sollte die vollständige Kontrolle über die Integrität der Daten haben und es sollte nicht möglich sein, es zu zwingen, falsche Daten zurückzugeben. Es sollte auf jeden Fall ausgeschlossen sein, dass die Anwendung aufgrund einer solchen Erzwingung abstürzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X