6

我的应用程序正在从我们的 Web 服务中提取 JSON 数据。到目前为止,在所有情况下,信息都将保留在内存中或只是动态刷新,除了 API 中使用的登录令牌外,无需在本地保留任何内容。通过我们添加的一个新功能,我们将获取一组位置,最多 26 个,包括长、纬度、半径和名称。

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

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

4

3 回答 3

5

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

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

ANSUserDefaults是一个具有旨在存储用户偏好的功能的 plist。它通常用于代替常规 plist 来保存几行代码,我认为这是一个坏主意,因为您会获得与任务无关的额外复杂性。

如果您希望保护登录以防止有人窃取设备并执行取证,请使用钥匙串。您可能想使用包装器并阅读一些文章,如果您有兴趣,请发表评论。

如果您寻找更多功能,请参阅在 iphone 上存储数据的最佳方式,但现在似乎并非如此。

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

[[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;
}
于 2011-08-07T12:32:09.653 回答
3

查看有关核心数据的本指南。这是在您的设备上本地存储数据的最佳方式。它是一个原生的可可 API,并且兼容绑定。此外,您可以选择是否将数据存储为 XML、SQLite 和二进制。

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

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

于 2011-08-07T12:05:25.250 回答
1

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

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

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

通过 RestKit 将 JSON 的本地 NSString 反序列化为对象(无网络下载)

于 2012-08-18T00:23:03.307 回答