NSnotificação não está sendo enviada quando pós -NomeName: chamado
-
22-09-2019 - |
Pergunta
Estou tentando obter uma instância de usar NSNotificationCenter
com addObserver
e postNotificationName
Mas não posso descobrir por que não funcionará.
Eu tenho 2 linhas para codificar para adicionar o observador e enviar a mensagem em 2 classes diferentes
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(newEventLoaded:) name:@"Event" object:nil];
e
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
Se eu definir o nome para nil
Funciona bem porque é apenas uma transmissão, quando tento definir um nome de notificação que as mensagens nunca passam.
Solução
Todo o meu código utiliza NSNotifications
igual a:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil];
O primeiro é registrar a notificação e a segunda postagem da notificação.
Outras dicas
Basicamente, tem tudo a ver com a ordem de execução. Se você executou o PostNotificationName antes do AddObServer, esse é um problema fácil de ter. Use pontos de interrupção e passe pelo código :)
Seu primeiro ponto de interrupção deve parar por aqui:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"ScanCompleted" object:nil];
Então aqui:
[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self];
Além disso, verifique se o seletor tem um cólon. Porque é a assinatura do método será:
- (void)updateView:(NSNotification *)notification;
Eu tive o mesmo problema. O motivo é que liguei
- (void)viewDidDisappear:(BOOL)animated{
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter removeObserver:self];
}
Portanto, verifique se você havia chamado RemoneBServer antes da Notificação.
Dicas: Você pode pesquisar a palavra -chave "RemowObServer" para descobrir se você chamou essa função.
Mude isso:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
para isso:
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil];
Se sua primeira notificação for registrada corretamente, o NewEventLoaded deve ser chamado.
Eu tive um problema semelhante e meu problema foi devido à notificação ser chamada em outro tópico. Isso resolveu meu problema.
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self];
});
Você já experimentou outros nomes, exceto @"Evento" e Nil? Só para ter certeza, você pode definir seus nomes de eventos em um arquivo e incluir isso no registro e envio de notificação. Por exemplo:
Arquivo de cabeçalho:
extern NSString * const NOTE_myEventName;
Arquivo fonte:
NSString * const NOTE_myEventName = @"MyEventName";
Cadastro:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleMyEvent:)
name:NOTE_myEventName
object:nil];
Envio de notificação:
[[NSNotificationCenter defaultCenter]
postNotificationName:NOTE_myEventName object:nil];
Eu consertei com sucesso meu "NSNotification
não sendo enviado quando postNotificationName:
chamado "Crash.
Eu descobri que o bug real está no manipulador de mensagens de notificação.
o postNotificationName
e addObserver
estão bem como o primeiro post deste tópico.