Pregunta

¿Es posible observar (suscribirse a) cambios en los valores almacenados en diferentes claves en un NSMutableDictionary? En mi caso ya existirían las teclas cuando se inicia la suscripción, pero cambiar los valores y me gustaría que se le notifique en este caso. Me gustaría que la clave del valor modificado en la notificación.

Asumo que si mis claves del diccionario eran todas las instancias NSString tan sólo pudiera suscribo a cada ruta de la clave de forma individual. Pero lo que si las llaves son no-cuerdas? ¿Estoy de suerte que en ese caso?

¿Fue útil?

Solución

Esto es una idea interesante. No puedo encontrar nada en NSDictionary o NSDictionaryController que parece prometedor. Mi primer instinto sería el uso de la composición en torno a un NSMutableDictionary e interceptar las llamadas a setObject: forKey:. (Y tal vez -removeObjectForKey :) para notificar a los suscriptores de cambios

Hay una Cacao con amor publicar en la subclasificación NSMutableDictionary que probablemente ser útil si decide ir por ese camino. También tengo creado mis propias subclases NSMutableDictionary , y le invitamos a utilizar el código de fuente abierta.

Se podría diseñar un protocolo de observación que podría especificar teclas particulares que deben ser controlados. No debe ser demasiado código, pero más que tengo tiempo para tirar abajo en el momento.

Otros consejos

He implementado con éxito este momento, el uso de la composición en torno a la NSMutableDictionary. Me sorprende lo poco código que hiciera falta. La clase I es implementado Junta, que se utiliza para representar el modelo en un juego de mesa. Cualquier persona puede suscribirse a los cambios de estados de mesa llamando al addObserver: método, implementado como esto:

- (void)addObserver:(id)observer {
    for (id key in grid)
        [self addObserver:observer
               forKeyPath:[key description]
                  options:0
                  context:key];
}

Dado que sólo puede suscribirse a las teclas utilizando el modelo de MVA, hice trampa y ratificó la Descripción de la llave, pero al pasar la llave misma, según el contexto. En los objetos que observan casos de mi Junta implemento el -observeValueForKeyPath:ofObject:change:context: hacer caso omiso de la cadena keyPath y sólo tiene que utilizar el contexto pasado-in.

Mi clase simple Junta no es compatible con MVA para las propiedades artificiales que se crea mediante este método, por lo que pasó en la propiedad 0 options por lo que la maquinaria de MVA no tratará de obtener los viejos / nuevos valores de dichas claves. Eso haría que mi código para hacer estallar.

Cualquier cosa que cambie la junta (en mi clase simple que sólo hay un método que hace esto) elevar las notificaciones necesarias para hacer que la maquinaria de MVA a entrar en acción:

- (void)setPiece:(id)piece atLocation:(Location*)loc {
    [self willChangeValueForKey:[loc description]];
    [grid setObject:piece forKey:loc];
    [self didChangeValueForKey:[loc description]];
}

Voila! Suscripción a un NSMutableDictionary con claves que no son cadenas!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top