2012-01-07 2 views
4

Мне нужно заполнить UITableView из источника данных NSSet. Очевидно, я хочу, чтобы таблица отсортировалась по некоторым критериям.Сортировочная обертка для NSSet

Я мог бы просто создать отсортированный NSArray с [mySet sortedArrayUsing...] и использовать его для моего источника данных таблицы. Но мне нужно что-то более мощное: базовые NSSet (mySet) меняются со временем, и я хочу, чтобы UITableView обновил соответственно (все еще отсортировано, конечно).

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

Так что я хотел бы иметь что-то вроде этого, я думаю:

NSArray* sortedWrapperArray = [SortedWrapper wrapperFor:mySet sortUsing:sortCriteria]; 

где sortedWrapperArray автоматически обновляет, когда основные изменения наборов.

Есть ли что-то подобное или похожее в мире Objective-C/Cocoa?

ответ

1

Если ваше приложение будет работать только на прошивке 5.0 или новее, вы можете использовать NSOrderedSet

+2

Это хороший подход, потому что 'NSOrderedSet' предоставляет метод под названием' -array', который возвращает массив прокси, который постоянно обновляется по мере того, как упорядоченный набор резервных копий мутируется. –

+0

Это в сочетании с методом -array - это то, что я искал. Благодаря! – henning77

+0

Вопрос задает отсортированный, не упорядоченный (который упорядочен по порядку вставки) – user102008

3

Если ваша базовая коллекция - NSSet, вы будете вынуждены сортировать ее с нуля каждый раз, когда набор изменяется, проводя O(N*Log(N)) время. Я думаю, что гораздо более эффективный способ решения этой проблемы - заменить NSSet на NSMutableArray и сохранить его в соответствии с вставками. Добавление и удаление элементов в отсортированном массиве все равно будет O(N): хотя вы можете найти позицию, используя двоичный поиск (см. Метод indexOfObject:inSortedRange:options:usingComparator:), вставка/удаление обычно O(N) (при очень низкой константе). Сохранение свойства уникальности набора также легко: если в бинарном поиске обнаружен тот же самый элемент, который вы собираетесь вставить, просто пропустите вставку. То же, стоимость проверка будет принимать O(Log(N))

+0

Вы состояние добавления и удаление элементов в отсортированном массиве будет 'O (журнал N)' являются вы это знаете? Is '- [NSMutableArray insertObject: atIndex:]' действительно 'O (1)'? – v1Axvw

+0

@ Ief2 Вы абсолютно правы - в стоимости будет преобладать необходимость переноса данных вверх или вниз по массиву. Я исправил ответ, большое спасибо! – dasblinkenlight

+0

dasblinkenlight Я не могу изменить NSSet на NSMutableArray, потому что я получаю NSSet из базового компонента с фиксированным интерфейсом. Поэтому я предполагаю, что мне нужна какая-то эффективная оболочка вокруг NSSet. – henning77

Смежные вопросы