ahe*_*ang 1 iphone objective-c
我想在我的应用程序中有一个"永久"的NSDictionary,从应用程序启动开始,我可以访问元素,甚至在我杀死应用程序并重新启动它之后.
此NSDictionary需要与应用程序紧密存储.一种方法是每次应用程序启动时从Web服务数据创建NSDictionary,然后创建一个代表这个NSDictionary的单例类,但我不认为这是好的.
NSDictionary将大约容纳10-20个对象,其中键是NSString或NSDate,值将是NSArray.NSArray中最多有大约50个条目(平均可能只有5-25个条目).
我打算使用这个NSDictionary作为计算的一部分,locationManager:didUpdateToLocation:fromLocation:每当用户每50-100米移动一次时,我就会在委托中进行计算.
建议是我能做到这一点的最佳方式.
只需将NSDictionary置于单例中就不会在应用程序启动之间保持不变,您需要将其保存到磁盘,然后在应用程序启动时从磁盘读取它.
如果在NSDictionary中没有自定义对象(您创建的子类),或者在NSArrays中或者根本没有自定义对象,则可以使用此方法来保存NSDictionary:
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag
并从磁盘打开字典:
- (id)initWithContentsOfFile:(NSString *)path
但是,如果您有自定义对象,则需要符合NSCoding协议.你必须使用2种不同的方法来保存和打开它:
NSCoding是一种协议,因此在您的标题中,您需要将其添加到接口行的末尾:
@interface myClassName : NSObject <NSCoding> {
Run Code Online (Sandbox Code Playgroud)
(你应该添加的唯一的东西是<NSCoding>)
然后在您的子类实现中,您需要添加以下方法:
- (id)initWithCoder:(NSCoder *)decoder
和:
- (void)encodeWithCoder:(NSCoder *)encoder
initWithCoder:当你想取消归档(/打开)你的NSDictionary(某个地方包含这个类)时,会调用该方法
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"];
}
Run Code Online (Sandbox Code Playgroud)
对于要存储的每个值,您需要具有相似的行(通常是您的类具有的所有属性,[和实例变量]).注意float线条与其他线条的不同之处.
键可以是您想要的任何字符串,只要每个属性都有自己的唯一键,并且它们在两种方法之间匹配.我个人使用该属性的名称,因为它更容易理解.
当你真的要保存你的NSDictionary时,你使用:
[NSKeyedArchiver archiveRootObject:myDictionary toFile:pathToMyDictionary];
Run Code Online (Sandbox Code Playgroud)
并打开字典:
NSDictionary *myDictionary = [NSKeyedUnarchiver unarchiveObjectWithFile:pathToMyDictionary];
Run Code Online (Sandbox Code Playgroud)
(取决于您可能需要的代码retain myDictionary)
要获取字典的路径(保存和打开),请执行以下操作:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pathToMyDictionary = [documentsDirectory stringByAppendingPathComponent:@"myDictionary.dat"];
Run Code Online (Sandbox Code Playgroud)
希望有所帮助,如果您对此答案有任何疑问,请注释:)