Tendrá que utilizar KVC. Pero, ¿cómo hacerlo? Después de todo, NSMutableArray no es compatible con Key-Value-Coding por sus métodos de mutación o cambios de contenido. La respuesta es proxying: como subclase NS [Mutable], la matriz es demasiado complicada.
NSProxy es una pequeña gran clase que puede usar para interceptar los mensajes enviados a su matriz como si fuera un NSMutableArray, y luego reenviarlos a alguna instancia interna. Desafortunadamente, tampoco cumple con KVC, ya que las entrañas de KVC viven en NSObject. Tendremos que usar eso, entonces. Una interfaz de muestra podría ser algo como esto:
@interface CFIKVCMutableArrayProxy : NSObject {
NSMutableArray *_innerArray;
}
- (NSUInteger)count;
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;
- (void)removeObjectAtIndex:(NSUInteger)index;
- (void)addObject:(id)anObject;
- (void)removeLastObject;
- (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;
//…
@end
Como se puede ver, estamos simulando una interfaz para NSMutableArray
, que es necesaria, ya que nuestro proxy debería poner en práctica todo como si se tratara de un NSMutableArray
. Esto también hace que la implementación sea lo más simple posible, ya que podemos reenviar los selectores a nuestro puntero interno NSMutableArray
. En aras de la brevedad, sólo voy a implementar dos métodos para mostrar lo que se ve como un esquema general:
@implementation CFIKVCMutableArrayProxy
//…
- (NSUInteger)count {
return _innerArray.count;
}
- (void)addObject:(id)anObject {
[self willChangeValueForKey:@"count"];
[_innerArray addObject:anObject];
[self didChangeValueForKey:@"count"];
}
- (void)removeLastObject {
[self willChangeValueForKey:@"count"];
[_innerArray removeLastObject];
[self didChangeValueForKey:@"count"];
}
@end
Si no tiene oportunidades para envolver una serie como esta, a continuación, tratar de volver a pensar en su código . Si una dependencia externa te está forzando a este tipo de esquina, intenta eliminarla. Siempre es malo trabajar con tus propias herramientas.
No estoy al 100% en esto, pero una clave de acceso a una matriz y el sufijo '@ count' es la forma de KVC para obtener este valor. ¿Entonces quizás puedas observar a KVO 'array @ count'? https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html#//apple_ref/doc/uid/20002176-BAJEAIEE – joerick