2014-02-01 6 views
2

У меня есть NSMutableArray, когда он добавляется, удаляется или изменяет уведомления из массива, обновляющего мой UITableView, так что эти изменения автоматически отражаются в UITableView с использованием наблюдения KVO. Это отлично работает.Filtered KVO NSMutableArray для UITableView

Теперь у нас есть новое требование, что мы хотим отфильтровать определенные элементы из массива. Это просто показывает, какие фильтрации я хотел бы сделать:

NSIndexSet *indexes = [array indexesOfObjectsPassingTest: 
         ^BOOL(MyObject *obj, NSUInteger idx, BOOL *stop) 
         { 
          return !obj.isHidden; 
         }]; 

NSMutableArray *newArray = [[array objectsAtIndexes:indexes] mutableCopy]; 

Однако делать выше не работает, я не могу создать новый массив, потому что он находится под наблюдением в UITableView, и я хочу сохраняйте мелкозернистые уведомления, которые мы получаем из вставок и абстракций из массива моделей, а не перезагружаем всю таблицу при изменении. Поэтому мне нужен способ получить уведомления только от недавно вставленных или удаленных элементов из модели, которые также соответствуют критериям.

Так что, я думаю, я действительно хочу, это два массива, один из которых является моделью, а другой - фильтрованным массивом представлений. Массив представления будет регистрироваться для уведомлений KVO с массивом модели. UITableView будет регистрироваться для уведомлений в фильтрованном массиве представлений. Поэтому, если вложение происходит в массиве модели, оно отправит уведомление в массив представления, тогда мне нужно проверить, соответствует ли он критериям, прежде чем вставлять его в массив представления, или если это не так, а затем игнорировать вставку. Проблема, с которой я сталкиваюсь, - это правильно работать, порядок элементов в модели важен и должен быть сохранен. Будем очень благодарны за любую помощь или предложения по альтернативным подходам.

+1

Звучит как хороший кандидат для ReactiveCocoa: https://github.com/ReactiveCocoa/ReactiveCocoa. , множество примеров в Интернете, или есть электронная книга за 10 долларов от Ash Furrow. –

+1

Интересное спасибо за подсказку, похоже, очень полезная структура в целом. – possen

ответ

0

Вы должны поддерживать массив модели и комбинировать уведомление с новым массивом. Так, например:

@property (nonatomic, strong) NSArray *modelArray; 
//This array is also initialized obviously 

@property (nonatomic, strong) NSArray *filteredArray; 
//On this array you put the array filtered and connect this with the notification. 
//So you can start each time from the model array and set the filtered array (and so 
//change automatically the tableView). 
Смежные вопросы