Обновите оригинальный NSMutableArray после фильтрации с помощью NSPredicate. - PullRequest
1 голос
/ 13 ноября 2011

Я недавно начал программировать для платформы iOS, но теперь мне нужна помощь, чтобы выяснить, как сделать что-то:

  • Для своего приложения я извлекаю некоторые данные JSON и помещаю эти данные как объектыв массив
  • Этот массив записывается в мой собственный файл PLIST (в каталоге docs)

Теперь, когда пользователи запускают действие синхронизации I:

  • Извлечение данных из PLIST
  • Получение метки времени для определенного объекта в массиве, полученного из PLIST
  • Использование метки времени в новом запросе JSON (для новых данных)

Пока все хорошо.

Теперь для моей (текущей) проблемы -> После получения новых данных (JSON req) я хочу обновить временную метку этого «определенного» объекта в массиве (и записать это в Plist).

Используя NSPredicate, я могу найти правильный набор данных в основном массиве ( stampArr ).

NSString *documentsDir = [NSHomeDirectory()stringByAppendingPathComponent:@"Documents"];
NSString *plistPath = [documentsDir stringByAppendingPathComponent:@"stamps.plist"];

NSMutableArray *stampArr = [[NSMutableArray alloc] initWithContentsOfFile:plistPath];

NSPredicate *filter = [NSPredicate predicateWithFormat:@"eventid = 1"];
NSMutableArray *filteredStampArr = [stampArr filteredArrayUsingPredicate:filter];

Но теперь, после обновления FilterStampArr , я хочу обновить основной массив данными из фильтрованного массива.

Другими словами, мне нужно обновить объект из массива с помощью новой метки времени (поля объекта).

Конечно, я мог бы использовать что-то вроде [stampArr addObject: [FilterStampArr copy]] после изменения массива filterd, но это просто создало бы дубликат информации.Я хочу перезаписать исходный объект.

Каким-то образом (я думаю) мне нужен «указатель», который сообщает мне расположение данных в исходном массиве, чтобы я мог изменить данные непосредственно в основном массиве?

(Надеюсь, мои вопросы ясны - если нет, скажите, пожалуйста)

Ответы [ 3 ]

2 голосов
/ 13 ноября 2011

Получите предмет, найдите его индекс в stampArr и замените его на newItem.

NSArray *filteredStampArr = [stampArr filteredArrayUsingPredicate:filter];
id item = [filteredStampArr objectAtIndex:0]; // id because the type of the item is not known

NSUInteger itemIndex = [stampArr indexOfObject:item];

[stampArr replaceObjectAtIndex:itemIndex withObject:newItem];
0 голосов
/ 13 ноября 2011

Внимательно прочитайте API!

попробовать:


[stampArr  filterUsingPredicate:];
0 голосов
/ 13 ноября 2011

Когда вы получаете FilterArray, вы можете напрямую обновлять объекты в нем (не заменять), и они будут обновляться в основном массиве.

...