Обновление NSArray при обновлении NSUserDefaults` - PullRequest
0 голосов
/ 18 июня 2011

У меня есть приложение, которое вытягивает список лучших мест на flickr и возвращает последние фотографии, размещенные в этих местах.Это все делается динамически.Я также храню список последних изображений, которые пользователь просматривал в NSUserDefaults.Данные, которые нужны flickr для получения изображения, хранятся в NSDictionary, поэтому я записываю NSDictionary в массив, а затем сохраняю указанный массив в NSUserDefaults.Это для учебного проекта, поэтому я должен использовать NSUserDefaults, даже если есть лучший способ.

На этом этапе ПОЧТИ все работает отлично.Тем не менее, я не уверен в способе обновления последних изображений после того, как пользователь просматривает новое изображение в динамических представлениях.NSUserDefaults обновлений без проблем, и дополнительные последние изображения показывают, если я закрываю приложение и перезапускаю его.

Вот мой код, в котором я пишу по умолчанию.Кажется, здесь нет проблем.

idvc = [[ImageDisplayViewController alloc] init];
idvc.flickrInfo = [placePhotosArray objectAtIndex:[indexPath row]];

// Add data to NSUserDefaults

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataFromRecentArray = [currentDefaults objectForKey:@"recentImages"];

if (dataFromRecentArray != nil)
{
    NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataFromRecentArray];
    if (oldArray != nil)
    {
        currentRecentImagesArray = [oldArray mutableCopy];
    } else {
        currentRecentImagesArray = [[NSMutableArray alloc] init];
    }
} else {
    currentRecentImagesArray = [[NSMutableArray alloc] init];
}

[currentRecentImagesArray addObject:idvc.flickrInfo];
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:currentRecentImagesArray] forKey:@"recentImages"];
[currentRecentImagesArray release];
[self.navigationController pushViewController:idvc animated:YES];
[idvc release];

Вот где я читаю данные обратно

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
   NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
   NSData *dataFromRecentImages = [currentDefaults objectForKey:@"recentImages"];
   if (dataFromRecentImages != nil) {
    NSArray *currentArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataFromRecentImages];
    recentImagesArray = [[NSArray alloc] initWithArray:currentArray];
   }
}

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

1 Ответ

1 голос
/ 19 июня 2011

Опция 1

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

Чтобы сделать это немного более эффективным, вы можете сохранить массив вновь просмотренных изображений и сохранять их в userDefaults только при выходе из вкладки.

Вариант 2

Используйте добавить наблюдателя в NSNotificationCenter, наблюдая "NSUserDefaultsDidChangeNotification".Таким образом, вы можете запустить функцию, которая обновляет последние изображения каждый раз, когда изменяются значения UserDefaults.

Опция 3

Создайте собственное уведомление, называемое что-то вроде «ImageViewed».Вы можете зарегистрировать последние изображения для прослушивания этого уведомления из NSNotificationCenter, и всякий раз, когда просматривается новое изображение, вы отправляете это уведомление в центр уведомлений.

Если вам нужны пояснения по любому из этих методов, я могу попробоватьчтобы объяснить это дальше.

...