Como criar uma classe para enviar e receber eventos através do NSNotificationCenter no Objective-C?
-
21-09-2019 - |
Pergunta
Preciso criar duas classes e ambas devem ser capazes de enviar e receber os eventos através dos métodos NSNotificationCenter.
@implementation Class A
-(void)sendEvent
{
addObserver:--- name:---- object:---
}
-(void)ReceiveEvent
{
postNotificationName: --- object:---
}
@end
O mesmo acontece com outra classe diz que Classb também deve poder enviar e receber os eventos. Como pode ser feito?
Solução
Idealmente, um objeto começaria a observar eventos interessantes assim que sua inicialização. Portanto, ele registrará todos os eventos interessantes com o NotificationCenter dentro de seu código de inicialização. sendEvent:
é basicamente um invólucro ao redor do postNotification:
método.
@implementation A
- (id)init {
if(self = [super init]) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveEvent:) name:@"SomeEvent" object:nil];
}
return self;
}
- (void)sendEvent {
[[NSNotificationCenter defaultCenter] postNotificationName:@"SomeOtherEvent" object:nil];
}
// Called whenever an event named "SomeEvent" is fired, from any object.
- (void)receiveEvent:(NSNotification *)notification {
// handle event
}
@end
O mesmo para a classe B.
Editar 1:
Você pode estar complicando demais o problema. Um centro do NSNotification atua como um corretor a quem todos os eventos são enviados e decide a quem encaminhar isso. É como o Padrão de observador Mas os objetos não observam ou notificam diretamente um ao outro, mas através de um corretor central - o NSNotificationCenter neste caso. Com isso você não precisa conectar diretamente duas classes que podem estar interagindo entre si com um #include
.
Ao projetar suas aulas, não se preocupe com a forma como um objeto seria notificado ou como ele notificaria outros objetos interessados, apenas que um objeto precisa ser notificado sobre alguns eventos quando ocorrer, ou precisa informar o NSNotficationCenter de seus eventos quando eles ocorrem.
Então, em resumo, descubra todos os eventos que um objeto deve conhecer e registrar esses eventos neste init()
método, e não os registra no dealloc()
método.
Você pode encontrar isso Tutorial básico útil.