Сравните NSArray с NSMutableArray, добавив дельта-объекты в NSMutableArray - PullRequest
2 голосов
/ 11 марта 2010

У меня есть NSMutableArray, который заполнен объектами строк. Для простоты скажем, что объекты - это человек, и каждый объект-человек содержит информацию об этом человеке.

Таким образом, у меня будет NSMutableArray, заполненный объектами person:

person.firstName
person.lastName
person.age
person.height

и т. Д.

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

В настоящее время я создаю NSArray набора результатов, очищаю NSMutableArray и затем заново заполняю NSMutableArray результатами NSArray перед уничтожением объекта NSArray.

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

Похоже, неэффективность заключается в том, что я должен иметь возможность сравнить два массива и получить отфильтрованный NSArray. Затем я могу добавить отфильтрованный набор в NSMutableArray. Это будет означать, что я могу просто добавить новые данные в NSMutableArray вместо того, чтобы выбросить все и заново заполнить.

И наоборот, мне нужно сделать тот же фильтр в обратном порядке, чтобы увидеть, есть ли записи, которые нужно удалить из NSMutableArray.

Есть ли способ сделать это более эффективным способом? Я что-то упустил в документации, где упоминается более простая техника?

У меня возникает проблема, когда я очищаю NSMutableArray и повторно заполняю его тем, что любые ссылающиеся таблицы теряют свое выбранное состояние строки. Я могу отследить и повторно выбрать его, но моя теория состоит в том, что использование некоторой формы сравнения и добавления объектов и удаления объектов вместо обработки всего массива в одном блоке может означать, что я сохраню ссылку на строку (при условии, что элемент не удалил конечно).

Любые предложения или помощь приветствуются.

Обновление

Было бы так же быстро выполнить быстрое перечисление для каждого сравнения каждой позиции, как я? Это кажется дорогой операцией, но с последним быстрым кодом перечисления это может быть довольно эффективно ...

Решение

Я закончил с предложением Абизема. Создание изменяемой копии массива и копии объекта представляется немного более быстрым подходом, чем использование решения sbooth при работе с большими наборами данных. Оба отлично работали, я просто получил преимущество, используя подход с изменяемым копированием. Это сказало, это действительно открыло мои глаза к NSSet, куда я не смотрел прежде.

Спасибо за отзыв.

Ответы [ 2 ]

11 голосов
/ 11 марта 2010

Вы можете использовать NSSet, чтобы легко делать подобные вещи (при условии, что ваши личные объекты уникальны):

NSSet *existingItems = [NSSet setWithArray:existingItemArray];
NSSet *newItems = /* Get the new items from the server */

// Determine which items were removed
NSMutableSet *removedItems = [NSMutableSet setWithSet:existingItems];
[removedItems minusSet:newItems];

// Determine which items were added
NSMutableSet *addedItems = [NSMutableSet setWithSet:newItems];
[addedItems minusSet:existingItems];

// Modify the original array
[existingItemArray removeObjectsInArray:[removedItems allObjects]];
[existingItemArray addObjectsFromArray:[addedItems allObjects]];

Я был бы удивлен, если производительность не приличная, так как я уверен, что реализация оптимизирована.

2 голосов
/ 11 марта 2010

Два очка.

  1. Новый NSArray содержит все данные, которые вам нужно показать. Вот почему вы добавляете и удаляете из NSMutableArray, чтобы соответствовать новому.
  2. Вы не хотите терять выбранное состояние строк в вашей таблице.

Вот мои предложения

  1. Вместо того, чтобы очищать NSMutableArray и заново заполнять его новым Array; почему бы не создать mutableCopy для NSArray и установить его в качестве нового NSMutableArray?
  2. Вместо того, чтобы беспокоиться о порядке элементов (и, следовательно, о выбранном номере строки); как насчет создания копии выбранного объекта, и после создания нового NSMutableArray, как на шаге 1, найдите соответствующий объект в новом массиве и установите его в качестве выбранной строки в таблице, используя его новый индекс.
...