在iOS中存储对象以供以后使用

时间:2011-08-07 12:02:47

标签: objective-c ios nsuserdefaults file-storage

我的应用从我们的网络服务中提取JSON数据。在所有直到现在的实例中,信息将保留在内存中或者只是动态刷新,除了API中使用的登录令牌之外,不需要保留本地任何内容。通过我们添加的新功能之一,我们将采用一组位置,最大26位,具有长,纬度,半径和名称。

我还需要为此数据添加1-2个字段以创建更大的对象。所以我的问题是,在iOS文件系统中存储此类数据的最佳方法是什么?目前我一直在使用NSUserDefaults,但对于大量数据而言,这似乎有点受限或不明智。也许不是。

需要检索,更改或编辑此数据并重新保存。所有这一切仍然保留了拉动这26个物体中的任何一个的能力。提前感谢您阅读和帮助。

3 个答案:

答案 0 :(得分:5)

对于如此少量的数据(26项),我建议archiving

使用NSKeyedArchiver / NSKeyedUnarchiver保存到plist。从委托的didFinishLaunchingWithOptions中读取您的数据,并听取UIApplicationWillResignActiveNotification保存它。

NSUserDefaults是一个plist,其功能旨在存储用户首选项。它经常被用来代替普通的plist来保存几行代码,我认为这是一个坏主意,因为你获得了与你的任务无关的额外复杂性。

如果您希望保护登录免受窃取设备和执行取证的人使用钥匙串。如果您感兴趣,可能需要使用包装器并阅读一些文章,评论。

如果您要查找更多功能,请参阅Best way to store data on iphone,但现在似乎不是这样。

一些代码可以帮助您入门...注册以保存应用程序resign:

[[NSNotificationCenter defaultCenter]
        addObserver:self 
           selector:@selector(saveMyData) 
               name:UIApplicationWillResignActiveNotification 
             object:nil];

在图表/字典的每个对象/您要存档的任何内容上实现NSCoding:

- (void)encodeWithCoder:(NSCoder*)coder {
    [coder encodeObject:myIvar forKey:kmyIvar];
}

- (id)initWithCoder:(NSCoder*)coder {
    if((self = [super initWithCoder:coder])) {
        self.myIvar = [[coder decodeObjectForKey:kmyIvar] retain];
    }
    return self;
}

答案 1 :(得分:3)

查看本指南中的核心数据。这是在您的设备上本地存储数据的最佳方式。它是一个原生的cocoa API,它兼容绑定。另外,您可以选择是将数据存储为XML,SQLite还是Binary。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html

对于任何远程大的东西,我会用它。

答案 2 :(得分:1)

我有同样的问题,只是想出了一个更好的解决方案。

您可以做的只是将JSON字符串存储为NSUserDefault。然后,当您重新加载应用程序时,使用您用于第一次将JSON字符串映射到对象的相同方法(或框架实用程序)。这样你仍然可以利用NSUserDefaults的易用性。

如果您使用RestKit来管理您的Web服务,它会变得更加容易。这篇文章的答案显示了如何使用RestKit的JSON解析器从JSON映射到您的对象。

Deserializing local NSString of JSON into objects via RestKit (no network download)