拥有一个始终存储在应用程序中的NSDictionary

时间:2011-03-26 22:16:25

标签: iphone objective-c

我希望在我的应用程序中有一个“永久性”NSDictionary,从应用程序启动开始,我可以访问这些元素,甚至在我杀死应用程序并再次启动它之后。
此NSDictionary需要与应用程序紧密存储。一种方法是每次应用程序启动时从Web服务数据创建NSDictionary,然后创建一个代表这个NSDictionary的单例类,但我不认为这是好的。

NSDictionary将大约容纳10-20个对象,其中键是NSString或NSDate,值将是NSArray。 NSArray中最多有大约50个条目(平均可能只有5-25个条目)。

我计划在每次用户每50-100米移动一次时,使用此NSDictionary作为我在委托locationManager:didUpdateToLocation:fromLocation:内进行的计算的一部分。

对于我能做到这一点的最佳方式,建议表示赞赏。

3 个答案:

答案 0 :(得分:5)

只需将NSDictionary放在单例中就不会在应用程序启动之间保留,您需要将其保存到磁盘,然后在应用程序启动时从磁盘读取它。

如果在NSDictionary中没有自定义对象(您创建的子类),或者在NSArrays中没有,或者根本没有,您可以使用此方法保存NSDictionary:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag

并从磁盘中打开字典:

- (id)initWithContentsOfFile:(NSString *)path


但是,如果您有自定义对象,则需要符合NSCoding协议。而且你必须使用两种不同的方法来保存和打开它:

NSCoding是一种协议,因此在您的标题中,您需要将其添加到接口行的末尾:

@interface myClassName : NSObject <NSCoding> {

(您应该添加的唯一内容是<NSCoding>

然后在您的子类实现中,您需要添加以下方法:

- (id)initWithCoder:(NSCoder *)decoder

- (void)encodeWithCoder:(NSCoder *)encoder


当你想取消归档(/打开)你的NSDictionary(某个地方包含这个类)时会调用initWithCoder:方法

encodeWithCoder:是您的NSDictionary存档(/保存)时调用的内容。 你不要自己打电话。您需要在其中添加代码:

- (id)initWithCoder:(NSCoder *)decoder {
    if ((self = [super initWithCoder:decoder])) {
        aProperty = [[decoder decodeObjectForKey:@"aProperty"] retain];
        anotherProperty = [[decoder decodeObjectForKey:@"anotherProperty"] retain];
        aFloat = [decoder decodeFloatForKey:@"aFloat"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [super encodeWithCoder:encoder];
    [encoder encodeObject:aProperty forKey:@"aProperty"];
    [encoder encodeObject:anotherProperty forKey:@"anotherProperty"];
    [encoder encodeFloat:aFloat forKey:@"aFloat"];
}

您需要为要存储的每个值设置类似的行(通常是您的类具有的所有属性,[和实例变量])。请注意float行与其他行的不同之处。

键可以是您想要的任何字符串,只要每个属性都有自己的唯一键,并且它们在两种方法之间匹配。我个人使用该属性的名称,因为它更容易理解。


当您确实要保存您使用的NSDictionary时:

[NSKeyedArchiver archiveRootObject:myDictionary toFile:pathToMyDictionary];

并打开字典:

NSDictionary *myDictionary = [NSKeyedUnarchiver unarchiveObjectWithFile:pathToMyDictionary];

(根据您的代码,您可能需要retain myDictionary


要获取字典的路径(保存和打开),请执行以下操作:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pathToMyDictionary = [documentsDirectory stringByAppendingPathComponent:@"myDictionary.dat"];

希望有帮助,如果您对此答案有任何疑问,请发表评论:)

答案 1 :(得分:2)

听起来你想要NSUserDefaults。它存储应用程序首选项,但也可以使用其他数据位。它本质上是一个专用的单例字典,可以普遍访问并自动保存。

答案 2 :(得分:2)

您可以使用[NSDictionary dictionaryWithContentsOfFile:foo]

从plist文件轻松生成NSDictionary

如果合适,plist可以包含在您的应用包中,或者您可以在首次启动时从Web服务获取数据并将其写入将来加载字典的plist。