更新NSUserDefaults时更新NSArray

时间:2011-06-18 17:02:29

标签: iphone nsarray nsuserdefaults

我有一个应用程序可以在flickr上提取顶部位置列表并返回发布到这些地方的最近照片。这一切都是动态完成的。我还将用户查看过的最近图像列表存储到NSUserDefaults。 flickr为了提取图像所需的数据存储在NSDictionary中,因此我将NSDictionary写入数组,然后将所述数组存储在NSUserDefaults中。这是一个学习项目,所以我需要使用NSUserDefaults,即使可能有更好的方法。

此时,ALMOST一切都很好。但是,在用户在动态视图中查看新图像后更新“最近图像”的方法时,我感到很沮丧。 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 个答案:

答案 0 :(得分:1)

选项1

您可以做的一件事是每次查看新图片时保存到userDefaults,然后选择“Recent Images”选项卡时,从默认值重新加载。

为了提高效率,您可以保存一组新查看的图像,并在离开标签时仅将其保存到userDefaults。

选项2

使用在NSNotificationCenter上添加观察者,观看“NSUserDefaultsDidChangeNotification”。这样,您可以运行一个函数,每次UserDefaults更改时都会更新最近的图像。

选项3

创建一个名为“ImageViewed”的通知。您可以注册最近的图像以收听来自NSNotificationCenter的通知,每当查看新图像时,您都会将该通知发布到通知中心。

如果您需要对这些方法进行一些澄清,我可以尝试进一步解释。