iphone - programacion - patron observer java 8
¿Cuál es la mejor manera de hacer observador/observable en Object-C(versión iphone) (3)
Estoy acostumbrado a codificar las UI de Java Swing, y en esas si tienes algunas propiedades que cambian, y quieres que tu UI se actualice, implementarías el patrón observador / observable. En Java haces esto normalmente haciendo que tu clase mantenga una lista de oyentes que notifica de diferentes eventos.
He jugado con Objective-C en la Mac, y eso tiene KVC y enlace, que parece funcionar muy bien y requiere menos código. Sin embargo, el iPhone SDK no parece tener esta funcionalidad, por lo que mi pregunta es: si tengo una clase que contiene datos que cambian, ¿cuál es la mejor manera de registrar un componente UI con esa clase para que pueda ser notificado de cambios en los datos que necesita mostrar?
Hay dos maneras incorporadas de hacer observación en Cocoa: Observación de clave-valor y notificaciones. En ninguno de los sistemas, necesita mantener o notificar a una colección de observadores usted mismo; el marco lo manejará por ti.
La Observación de valores-clave (KVO) le permite observar una propiedad de un objeto, incluso una propiedad que representa una colección, y recibir notificaciones de cambios en esa propiedad. Solo tiene que enviar el objeto -addObserver:forKeyPath:options:context:
pasando el objeto que desea recibir actualizaciones, la ruta clave de la propiedad (relativa al receptor) para la que desea recibir actualizaciones y los tipos de actualizaciones quieres recibir (Hay métodos similares que puede usar si desea observar una propiedad que representa una colección).
Las notificaciones son más antiguas y pesadas. Se registra con un NSNotificationCenter
, generalmente el centro predeterminado, un objeto y un par de selectores a los que se les envía una notificación cuando ocurre un evento. El objeto de notificación en sí mismo puede contener datos arbitrarios a través de su propiedad userInfo
, y puede elegir observar todas las notificaciones de un nombre específico en lugar de las que se aplican a un objeto particular.
¿Cuál debería usar en un caso particular? En general, si le importan los cambios en una propiedad específica de un objeto específico, use Observación de valores-clave. Para eso está diseñado y es intencionalmente liviano. (Entre otros usos, es la base sobre la que se construyen los enlaces de cacao). Si le importa un cambio en el estado que no está representado por una propiedad, entonces las notificaciones son más apropiadas.
Por ejemplo, para mantenerme sincronizado cuando el usuario cambia el nombre de un objeto modelo, usaría KVO. Para saber cuándo se guardó un gráfico completo de objetos, usaría las notificaciones.
También encontré que puedes hacer:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleWhateverChange) name:@"whateverChange" object:nil];
Para registrarse para eventos de cambio, y
[[NSNotificationCenter defaultCenter] postNotificationName:@"whateverChange" object:nil];
Para despedirlos. Podría ser un N00b pero no pude lograr que el observador de la ruta clave funcionara para mí.
Por lo general, no es la forma en que se hace. Eche un vistazo a la discusión aquí , en particular, el enlace a la documentación de Apple.
Si aún quieres hacerlo de la forma en que dices que lo haces, no es particularmente difícil implementar algo como enlaces "a mano". Simplemente creará un objeto "vinculante" que sepa cómo suscribirse a los cambios y se conecte a una propiedad de una vista.
Para responder realmente cómo se hace, normalmente tiene un objeto controlador que supervisa el estado del modelo (que actúa como un observador) y actualiza los objetos de visualización según sea necesario.