avrete bisogno di utilizzare KVC. Ma come fare per farlo? Dopotutto, NSMutableArray non è compatibile con la codifica della chiave per i suoi metodi di mutazione o modifiche dei contenuti. La risposta è proxying -come sottoclassi NS [Mutable] Array è troppo di una seccatura.
NSProxy è una piccola grande classe che è possibile utilizzare per intercettare i messaggi inviati all'array come se si fosse un NSMutableArray, quindi inoltrarli a un'istanza interna. Sfortunatamente, non è nemmeno conforme a KVC, dal momento che l'intestino di KVC vive in NSObject. Dovremo usarlo, allora. Un'interfaccia di esempio potrebbe essere simile a questa:
@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
Come potete vedere, stiamo simulando un'interfaccia per NSMutableArray
, che è necessaria, come la nostra procura dovrebbe attuare ogni cosa come se fosse un NSMutableArray
. Ciò rende anche l'implementazione il più semplice possibile, in quanto possiamo semplicemente inoltrare i selettori al nostro puntatore interno NSMutableArray
. Per ragioni di brevità, io implementare solo due metodi per mostrare ciò che un quadro generale appare come:
@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
Se non ci sono opportunità per avvolgere una serie come questa, quindi provare a ripensare il proprio codice . Se una dipendenza esterna ti sta costringendo in questo tipo di angolo, prova a rimuoverlo. È sempre una brutta cosa aggirare i tuoi stessi strumenti.
Non sono al 100% su questo, ma un keyPath a un array e il suffisso '@ count' è il modo KVC per ottenere questo valore. Quindi forse puoi KVO osservare 'array @ count'? https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html#//apple_ref/doc/uid/20002176-BAJEAIEE – joerick