Pergunta

Eu tenho um caso em que a visualização da criança envia notificação à sua visão dos pais. Agora estou ligando addObserver: dentro viewWillAppear: e removeObserver: dentro viewWillDisappear:. Mas acho que isso não está correto desde viewWillAppear: Chamadas quando a visualização é atualizada.

[[NSNotificationCenter defaultCenter] addObserver: (id)observer selector: (SEL)aSelector name: (NSString *)aName object: (id)anObject];

[[NSNotificationCenter defaultCenter] removeObserver: (id)observer name: (NSString *)aName object: (id)anObject];

Obrigado.

Foi útil?

Solução

Na verdade, isso é uma má ideia. Quando a memória fica baixa, seu controlador de exibição pode receber um aviso de memória. O comportamento padrão nesta instância é esclarecer sua opinião (se você não estiver na tela). Nesse caso, você pode receber a mensagem ViewDidload enviada pela segunda vez (após o evento de memória, quando sua visualização for trazida de volta à tela pelo controlador de navegação). Assim, você terá dois registros do mesmo objeto, mas apenas uma remoção (em seu desabiloc)

Uma solução melhor é definir um sinalizador dizendo que você se registrou ou se registrar no seu método init.

Outras dicas

Eu acho que as posições corretas para se registrar para notificação são viewDidLoad o método e a posição correta para o não registrar as mesmas notificações é dealloc método.

Ben está certo - mas eu encontrei outro, potencialmente frágil, em torno disso. Acabei de descobrir isso porque eu estava sempre recebendo o "... foi resolvido enquanto os observadores de valor -chave ainda estavam registrados com ele"

Não sei por que - mas quando eu tinha addobserver no meu método init e removebserver no meu método Dealloc - eu ainda estava recebendo a mensagem KVO ainda estava sendo observada. Passei e verifiquei que meu RemofObserver estava sendo chamado corretamente.

Mudei meu addobserver para o método ViewDidload, e isso parecia funcionar.

Deixei um RemepObserver em ViewDidunLoad e em Dealloc; Mas não gosto disso porque não está equilibrado. Mas, em circunstâncias normais, meu ViewDidunLoad não é chamado - isso é apenas proteção, caso eu receba uma notificação de baixa memória.

Mas posso ver potencialmente entrar na situação em que um evento de baixa memória entra, o ViewDidunLoad é chamado. Se eu bater em Dealloc algum tempo depois (antes de bater no ViewDidload novamente), chamarei o RemoneBserver duas vezes!

Então, acho que vou mantê -lo no meu ViewDidload e no meu Dealloc.

Ainda não sei por que não funciona corretamente se eu fizer o addobserver no meu método init.

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