2013-08-05 10 views
5

Oglądam NSArrayproperty z KVO. Zaimplementowałem KVC, podobnie jak w this post, a także zaimplementowałem większość akcesorów do tablic KVC. Aby zmutować, używam mutableArrayValueForKey. To działa dobrze, z wyjątkiem 2 kwestie:KVO na removeAllObjects Wyzwala NSKeyValueChangeRemoval dla każdego elementu oddzielnie

  1. Kiedy zadzwonić removeAllObjects, dostaję NSKeyValueChangeRemoval zmianę dla każdego pojedynczego usuniętego elementu. Chcę otrzymać tylko jedno powiadomienie NSKeyValueChangeRemoval ze wszystkimi usuniętymi indeksami.

  2. Podobnie, gdy zadzwonię pod numer addObjectsFromArray:, otrzymam NSKeyValueChangeInsertion za każdy dodany element. Chciałbym otrzymać tylko jedno powiadomienie NSKeyValueChangeInsertion ze wszystkimi dodanymi indeksami.


Uwaga, zrobić wdrożyły metody KVC remove<Key>ItemsAtIndexes: i insert<Key>Items:atIndexes:. Są one jednak nazwane , a nie.

używam następujące rozwiązania:

- (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]; 
} 

Czy istnieje sposób, aby bezpośrednio wykorzystać removeAllObjects i addObjectsFromArray: bez potrzeby powyższych obejścia?

+0

Literówka w ostatnim wierszu kodu? – Mundi

+0

Yepp, dzięki. Poprawione. – fabb

Odpowiedz

0

Jestem pewien, że jesteś świadomy, że nie możesz obserwować samej tablicy, tylko jej atrybutów. Myślę, że twoje obejście jest nieuniknione.

Powiedziawszy - bardzo podoba mi się sposób, w jaki to rozwiązałeś!

+0

Czy mógłbyś bardziej szczegółowo wyjaśnić, dlaczego uważasz, że jest to nieuniknione? Domyślam się, że problem wynika z implementacji metod 'removeAllObjects' i' addObjectsFromArray: 'które dodają/usuwają elementy jeden po drugim. Na pewno zadałem pytanie, może coś przeoczyłem. Gdy obejście to jest nieuniknione, dokonam obejścia metod kategorii na "NSArray". – fabb

+0

Tak jak powiedziałem, obiekty tablicy są obserwowane, a nie sama tablica. To wyjaśnia nieuniknione. Kategoria wydaje się być dobrym rozwiązaniem. – Mundi

Powiązane problemy