application à base de documents Cocoa: Notification pas toujours reçu par l'observateur
-
01-10-2019 - |
Question
Je espère que quelqu'un peut aider avec mon problème de notification. J'ai une notification qui semble être configuré correctement, mais il n'a pas trouvé comme prévu. Je développe un document app base. Le délégué / document messages de classe la notification lors de la lecture d'un fichier enregistré:
[[NSNotificationCenter defaultCenter] postNotificationName:notifyBsplinePolyOpened object:self];
Logging me dit que cette ligne est atteinte à chaque fois que j'ouvre un document enregistré.
Dans la classe drawView, je les observateurs de la notification WindowOpen et le fichier bsplinePoly ouvrir la notification:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mainWindowOpen:)
name:NSWindowDidBecomeMainNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(savedBspline:)
name:notifyBsplinePolyOpened
object:nil];
- (void) mainWindowOpen:(NSNotification*) note
{
NSLog(@"Window opened");
_mainWindow = [note object];
}
- (void) savedBspline:(NSNotification*) note
{
NSLog(@"savedBspline called");
NSLog(@"note is %@", [note name]);
}
Le comportement est impair. Quand j'enregistrer et fermer la fenêtre principale et rouvre, je reçois le message « fenêtre ouverte », mais pas le message « savedBspline appelé ». Si je laisse une fenêtre principale ouverte et ouvrir une session enregistrée précédemment, je reçois le message « fenêtre ouverte » et le message « savedBspline appelé ».
J'ai cherché la discussion en ligne et la documentation d'Apple DevCenter, mais je n'ai pas vu ce problème.
La solution
Travaux de livraison de NSNotification
comme prévu ( au moins lorsqu'aucun de la NSNotificationQueue
sont impliqués ). Ils sont livrés immédiatement, non pas sur d'autres sujets, sans délai, et non filtrée.
Je dirais que, certains de vos objets ne sont pas encore instancié lorsque les feux de notification ou vous mélanger l'ordre d'exécution d'une autre manière: Vous dites que vous publiez la notification lors de la lecture d'un fichier enregistré, mais vous » Il manque quelque la notification lors de l'enregistrement et la fermeture de la fenêtre.
Pour aider à corriger, je vous suggère de mettre en place un observateur de notification vous application délégué qui enregistre simplement toutes les notifications. Vous êtes sûr donc que toutes les notifications sont livrées comme prévu.