2013-08-05 18 views
5

Tôi đang xem NSArrayproperty với KVO. Tôi đã triển khai KVC như trong this post và tôi cũng đã triển khai hầu hết các trình truy cập mảng KVC. Để thay đổi nó, tôi sử dụng mutableArrayValueForKey. Nó hoạt động tốt, ngoại trừ 2 vấn đề:KVO trên removeAllObjects Kích hoạt NSKeyValueChangeRemoval cho từng Mục riêng biệt

  1. Khi tôi gọi removeAllObjects, tôi nhận được một NSKeyValueChangeRemoval thay đổi cho từng hạng mục gỡ bỏ đơn. Tôi chỉ muốn nhận được một thông báo NSKeyValueChangeRemoval với tất cả các chỉ mục đã xóa trong đó.

  2. Tương tự khi tôi gọi addObjectsFromArray:, tôi nhận được NSKeyValueChangeInsertion cho từng mục được thêm vào. Tôi chỉ muốn nhận được một thông báo NSKeyValueChangeInsertion với tất cả các chỉ mục được thêm vào trong đó.


Chú ý rằng tôi làm đã triển khai phương pháp KVC remove<Key>ItemsAtIndexes:insert<Key>Items:atIndexes:. Chúng là không phải là được gọi là mặc dù.

tôi sử dụng cách giải quyết như sau:

- (void)removeAllObjectsWorkaroundFromArray:(NSMutableArray *)modelArray { 
    NSRange indexRange; 
    indexRange.length = modelArray.count; 
    indexRange.location = 0; 
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:indexRange]; 
    [modelArray removeObjectsAtIndexes:indexSet]; 
} 

- (void)addObjectsFromArrayWorkaroundWithArray:(NSMutableArray *)modelArray arrayToAdd:(NSArray *)arrayToAdd { 
    NSRange indexRange; 
    indexRange.length = arrayToAdd.count; 
    indexRange.location = modelArray.count; 
    NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:indexRange]; 
    [modelArray insertObjects:arrayToAdd atIndexes:indexSet]; 
} 

Có cách nào để trực tiếp sử dụng removeAllObjectsaddObjectsFromArray: mà không cần các giải pháp trên?

+0

Lỗi trong dòng cuối cùng của mã? – Mundi

+0

Yepp, cảm ơn. Đã sửa. – fabb

Trả lời

0

Vì tôi chắc chắn bạn biết rằng người ta không thể quan sát chính mảng đó, chỉ là thuộc tính của nó. Vì vậy, tôi nghĩ rằng workaround của bạn là không thể tránh khỏi.

Điều đó đang được nói - Tôi thực sự thích cách bạn giải quyết vấn đề này!

+0

Bạn có thể giải thích thêm một chút về lý do tại sao bạn cho rằng điều đó là không thể tránh khỏi? Tôi đoán vấn đề bắt nguồn từ việc thực hiện các phương thức 'removeAllObjects' và' addObjectsFromArray: 'để thêm/xóa từng mục một. Để chắc chắn tôi đã hỏi câu hỏi, có lẽ tôi đã bỏ qua điều gì đó. Khi workaround là không thể tránh khỏi, tôi sẽ thực hiện các phương pháp workaround category-methods trên 'NSArray'. – fabb

+0

Như tôi đã nói, các đối tượng của mảng được quan sát, không phải là mảng. Điều đó giải thích điều không thể tránh khỏi. Danh mục có vẻ là một cách tốt để đi. – Mundi

Các vấn đề liên quan