我希望在我的应用程序中有一个“永久性”NSDictionary,从应用程序启动开始,我可以访问这些元素,甚至在我杀死应用程序并再次启动它之后。
此NSDictionary需要与应用程序紧密存储。一种方法是每次应用程序启动时从Web服务数据创建NSDictionary,然后创建一个代表这个NSDictionary的单例类,但我不认为这是好的。
NSDictionary将大约容纳10-20个对象,其中键是NSString或NSDate,值将是NSArray。 NSArray中最多有大约50个条目(平均可能只有5-25个条目)。
我计划在每次用户每50-100米移动一次时,使用此NSDictionary作为我在委托locationManager:didUpdateToLocation:fromLocation:
内进行的计算的一部分。
对于我能做到这一点的最佳方式,建议表示赞赏。
答案 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可以包含在您的应用包中,或者您可以在首次启动时从Web服务获取数据并将其写入将来加载字典的plist。