ios - notificationcenter swift 4
removeObserver with NSNotification... ¿qué estoy haciendo mal? (3)
La llamada -dealloc
no ocurre automáticamente después de que se despide el controlador de vista; aún puede haber algo de "vida" en la vida útil del controlador de vista. En ese período de tiempo, el controlador de vista aún está suscrito para esa notificación.
Si eliminas el observador en -viewWillDisappear:
o -viewDidDisappear:
esto tendrá un efecto más inmediato:
- (void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"alert"
object:nil];
}
Básicamente, tengo una vista1 que en algún punto, llama vista2 (a través de presentModalViewController:animated:
:). Cuando se presiona un determinado UIButton
en view2, view2 llama a un método de notificación en view1 y se desactiva inmediatamente después. El método de notificación aparece una alerta.
El método de notificación funciona bien y se llama adecuadamente. El problema es que cada vez que se crea view1 (solo debe existir una view1 a la vez), probablemente se NSNotification
otra NSNotification
porque si paso de view0 (el menú) a view1, y luego varias veces, recibo una serie del mismo mensaje de alerta, uno tras otro, del método de notificación tantas veces como abrí una vista1.
Aquí está mi código, por favor dime qué estoy haciendo mal:
View1.m
-(void) viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(showAlert:)
name:@"alert"
object:nil];
}
-(void) showAlert:(NSNotification*)notification {
// (I''ve also tried to swap the removeObserver method from dealloc
// to here, but it still fails to remove the observer.)
// < UIAlertView code to pop up a message here. >
}
-(void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
View2.m
-(IBAction) buttonWasTapped {
[[NSNotificationCenter defaultCenter] postNotificationName:@"alert"
object:nil];
[self dismissModalViewControllerAnimated:YES];
}
-(void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
No hay nada de malo en dealloc
removeObserver:
en dealloc
. Solo el hecho de que no se llame significa que view1 no se publica correctamente después de descartar. Parece que algo mantiene el puntero en su vista1, verifique los ciclos de retención.
Además, no debes llamar a dealloc en super.
Si implementa la eliminación de Observer en viewWillDisappear:
o viewDidDisappear:
entonces no debe dejar la adición del observador en viewDidLoad
.
En su lugar, coloque la adición del observador en viewWillAppear:
El problema que tiene es que cuando se muestre cualquier vista de UIViewController
, se UIViewController
la eliminación de su observador y, dado que agregó observador en viewDidLoad
lo que ocurrirá solo una vez, se perderá.
Tenga en cuenta que este enfoque funciona bien para los objetos que no desea observar, mientras que su vista principal no está en primer plano.
También viewDidUnload
en cuenta que viewDidUnload
se ha depreciado.