2012-01-31 6 views
6

Existen varias preguntas relacionadas con este tema, pero ninguna de ellas responde mi pregunta.Valor clave Observe removeObserver cuando el objeto observado está desasignado

Quiero removeObserver de un objeto cuando ese objeto se desasigna. Estoy usando KVO ya que se deben observar varios elementos, y NSNotification tiene una sobrecarga enorme en ese caso.

Aquí está el panorama:

(múltiples) Los objetos están siendo observados por varios otros objetos. Cuando el observer se desasigna, puedo eliminarlo como observador. Pero cuando se desasigna el observed, necesito decirle a todos observers que se eliminen como observadores. ¿Como hacer esto?

Respuesta

1

puede publicar por separado una notificación desde -(void)dealloc cuando se observe obtener desasignado. al recibir a todos los demás observadores se eliminará la notificación requerida.

+0

¿No habrá tantas notificaciones, y todo el propósito del uso de kvo se derrota. Además, terminaría así: 1. Observe alguna propiedad de un objeto. 2. De todos los objetos observados, ejecute una notificación cuando se desasigna. 3. Escuche la notificación de desasignación y elimine al observador. Eso es mucho trabajo. ¿No hay alguna solución limpia? – Sailesh

3

Sailesh si el objeto (observado) es desasignado, entonces ese objeto no puede ser alterado o su valor no puede cambiarse así que si los observadores están observando un objeto desasignado y ese objeto desasignado nunca va a enviar ningún tipo de observación notificación entonces ¿Hay alguna diversión de eliminar observadores ???
~~~~~~~~~~~~~~~~~~~~~ Editado ~~~~~~~~~~~~~~~~~~~~~~~~
hey tengo algo de here. La idea es que usted observe una propiedad adicional, digamos alive y escriba en dealloc of observado como alive = NO; y como esta propiedad se cambia, todos los observadores recibirán una notificación y por lo tanto, usted puede eliminar a todos los observadores.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+2

Después de ver este mensaje de error en la consola, le gustaría eliminarObserver, aunque no es divertido :). 'Una instancia 0xd89f200 de la clase MyClass fue desasignada mientras los observadores de valores clave todavía estaban registrados con ella. La información de observación se filtró y puede incluso confundirse con algún otro objeto. – Sailesh

+0

hmmm eso es algo serio ... déjame buscar si puedo encontrar algo ... gracias por responder :) –

+0

He editado la respuesta ... –

2

Creo que hay un problema de diseño aquí. El objeto observado no debería preocuparse por sus observadores. Usted dice que quiere eliminar a los observadores del método de objetos tratados dealloc. Pero, ¿por qué se desasigna? Si todavía se observa que hay una propiedad en alguna parte, el objeto no se desmantelará. Los buenos resultados de diseño no dejan observadores cuando se llama dealloc.

Imagina una vista que se registra como un observador en un objeto modelo. Este objeto modelo se retiene en la vista o en el controlador. El objeto modelo no lo llamará dealloc siempre que se conserve en alguna parte. Solo cuando se libera la última propiedad, debe llamar a dealloc. Así que supongamos que se liberan todas las propiedades, a excepción del view/viewcontroller y queda un observador (la vista). Ahora, antes de que view/viewcontroller libere su propiedad sobre el objeto modelo, también debe eliminar la vista como observador. Entonces, cuando se llame al método dealloc, no debería haber observador.

+0

Considere un caso cuando dos objetos se observan entre sí. El diseño que sugiera creará un ciclo de retención. En cualquier caso, el observador solo puede tener una referencia débil a lo observado, y hacer lo contrario puede no ser un buen diseño, teniendo en cuenta todos los demás aspectos de la aplicación. – Sailesh

+1

En mi opinión, dos objetos que se observan entre sí son un caso de mal diseño. –

+0

Gracias por esta respuesta. Me di cuenta de que mi decisión de tener una propiedad débil sobre el modelo era incorrecta. Cambié a una relación fuerte ahora, y con suerte, no veo muchos bloqueos de KVO ahora. – rounak

Cuestiones relacionadas