Dónde eliminar el observador de NSNotification en Swift?


¿Dónde debo quitar el observador de NSNotification en Swift, ya que viewDidUnload y dealloc() no están disponibles?

Author: Pang, 2015-02-24

6 answers

Utilice el siguiente método que funciona igual que dealloc.

deinit {
    // Release all resources
    // perform the deinitialization
}

Se llama a un desinicializador inmediatamente antes de que se desasigne una instancia de clase. Escribes deinitializers con la palabra clave deinit, de manera similar a como se escriben los intializers con la palabra clave init. Los desinicializadores solo están disponibles en tipos de clase.

Desinicializador de Swift

 50
Author: Kampai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-07 09:15:02

A partir de iOS 9 (y OS X 10.11), no necesita eliminar observadores usted mismo, si no está utilizando observadores basados en bloques.

El sistema lo hará por usted, ya que utiliza referencias débiles de cero para los observadores, donde puede.

Puede encontrar más información en Notas de la versión de Foundation para OS X v10.11 e iOS 9.

Si el observador puede almacenarse como una referencia débil de reducción a cero, el almacenamiento subyacente almacenará al observador como una referencia débil a cero, alternativamente si el objeto no se puede almacenar débilmente (es decir, tiene un mecanismo de retención/liberación personalizado que evitaría que el tiempo de ejecución pueda almacenar el objeto débilmente) almacenará el objeto como una referencia de cero no débil. Esto significa que los observadores no están obligados a desinscribirse en su método de desasignación.

 61
Author: Nikola Milicevic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-01 11:54:27

Puedes usar tres métodos:

1-después de popViewController, atrás navigationController o dismissViewControllerAnimated:

deinit {
        print("Remove NotificationCenter Deinit")
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

O

2 - viewDidDisappear, eliminar después de que ya es el siguiente controlador de vista:

override func viewDidDisappear(animated: Bool) {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

O

3 - viewWillDisappear - antes de abrir la siguiente vista:

override func viewWillDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

Sintaxis de Swift 3.0:

NotificationCenter.default.removeObserver(self)
 29
Author: Pablo Ruan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-12 10:04:29

Swift proporciona un método deinit que se llama a instancias de clases antes de que se destruyan.

Https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Deinitialization.html

 3
Author: pmick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-24 07:11:05

También quiero señalar que debe usar este método:

func addObserver(_ observer: Any, selector aSelector: Selector, name aName: NSNotification.Name?, object anObject: Any?)

En lugar de

func addObserver(forName name: NSNotification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol

Este último no eliminará al observador (Se encontró con este problema recientemente). El primero eliminará al observador si está utilizando iOS9.

 2
Author: Guy Daher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-28 16:17:43

También es bueno si agrega su observador en viewWillAppear() y lo elimina en viewWillDisappear()

 0
Author: mayank khare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-01 12:08:26