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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top