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

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米移动一次时,我就会在委托中进行计算.

建议是我能做到这一点的最佳方式.

Jon*_*an. 5

只需将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)

希望有所帮助,如果您对此答案有任何疑问,请注释:)