Bạn sẽ cần phải sử dụng KVC. Nhưng làm thế nào để đi về làm điều đó? Sau khi tất cả, NSMutableArray không phải là Key-Value-Coding phù hợp với các phương pháp đột biến của nó hoặc thay đổi nội dung. Câu trả lời là proxy-subclassing NS [Mutable] Array là quá nhiều rắc rối.
NSProxy là một lớp nhỏ tuyệt vời mà bạn có thể sử dụng để chặn các thư được gửi tới mảng của bạn như thể bạn là NSMutableArray, sau đó chuyển tiếp chúng vào một số cá thể nội bộ. Thật không may, nó cũng không phải là KVC tuân thủ, như là ruột của KVC sống trong NSObject. Sau đó, chúng ta sẽ phải sử dụng nó. Một giao diện mẫu có thể trông như thế này:
@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
Như bạn có thể thấy, chúng ta đang mô phỏng một giao diện cho NSMutableArray
, đó là cần thiết, như proxy của chúng tôi nên thực hiện tất cả mọi thứ như thể đó là một NSMutableArray
. Điều này cũng làm cho việc triển khai càng đơn giản càng tốt, vì chúng ta chỉ có thể chuyển tiếp các bộ chọn đến con trỏ bên trong của chúng ta là NSMutableArray
. Vì lợi ích của ngắn gọn, tôi sẽ chỉ thực hiện hai phương pháp để bạn thấy những gì một phác thảo chung hình như:
@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
Nếu bạn không có cơ hội để quấn một mảng như thế này, sau đó cố gắng suy nghĩ lại mã của bạn . Nếu một phụ thuộc bên ngoài đang buộc bạn vào loại góc này, hãy cố gắng loại bỏ nó. Luôn luôn là một điều xấu để làm việc xung quanh các công cụ của riêng bạn.
Tôi không phải là 100% về điều này, nhưng một keyPath cho một mảng và hậu tố '@ count' là cách KVC để có được giá trị này. Vì vậy, có lẽ bạn có thể KVO quan sát 'mảng @ đếm'? https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/CollectionOperators.html#//apple_ref/doc/uid/20002176-BAJEAIEE – joerick