Objective c 将CLLocation保存到plist

Objective c 将CLLocation保存到plist,objective-c,ios,plist,Objective C,Ios,Plist,我正在努力将几个位置保存到plist文件中以供以后使用, 通过谷歌搜索,我发现CLLocation数组本身无法保存, 所以我想知道怎么做 我正在考虑使用几个类将单个CLLocation对象“序列化”/“反序列化”到NSDictionary中,然后将这些NSDictionary的数组存储到plist文件中,但我想知道是否有更好/更智能/更可靠的方法来实现这一点 提前谢谢 编辑: 这是我用来在plist中保存数据的函数(c_propertyName从答案中获取代码) 编辑2-解决方案: 好的,我已经

我正在努力将几个位置保存到plist文件中以供以后使用, 通过谷歌搜索,我发现CLLocation数组本身无法保存, 所以我想知道怎么做

我正在考虑使用几个类将单个CLLocation对象“序列化”/“反序列化”到NSDictionary中,然后将这些NSDictionary的数组存储到plist文件中,但我想知道是否有更好/更智能/更可靠的方法来实现这一点

提前谢谢

编辑:

这是我用来在plist中保存数据的函数(c_propertyName从答案中获取代码)

编辑2-解决方案:


好的,我已经想好了。就在下面,我为自己的问题发布了一个有两种选择的解决方案。

使用KVC非常简单

下面是NSObject类别获取属性名称的方法(需要


然后保存字典。

经过几个小时的搜索,我已经了解了整个场景。 这里有几个解决方案;第一个更“脏”,因为这是我想出的第一个,而第二个更优雅。不管怎样,我会把他们两个都留下,因为也许他们两个都能帮上某人的忙

S O L U T I O N-1

多亏了mit3z的帮助,我才能够把这些东西拼凑起来,找出一个解决方案

正如他所指出的,您可以将此方法实现到NSObject上的一个类别中:

 - (NSArray *)c_propertyNames;
(查看他对该部分代码的回复,以及更多详细信息)

这给了我做这件事的自由:

- (void) addLocation {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"/Locations.plist"];

    NSArray *keys = [curLocation c_propertyNames]; // retrieve all the keys for this obj
    NSDictionary *values = [self.curLocation dictionaryWithValuesForKeys:keys];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    for(NSString *key in keys) {
        NSString *aaa = [NSString stringWithFormat:@"%@", (NSString *)[values valueForKey:key]];
        [dict setValue:aaa forKey:key];
    }

    [dict writeToFile:path atomically:YES];
}
需要使用superdumb for循环将NSDictionary中的所有数据转换为NSString,以便可以毫无困难地将它们写入plist文件。如果您只是制作字典,然后尝试立即保存,则不会成功

通过这种方式,我可以将所有CLLocation obj“序列化”为dict,然后写入plist文件

S O L U T I O N-2

我想出了一个非常简单(也更优雅)的方法:使用NSCoding。 因为(我意识到)CLLocation数据类型符合NSCoding,所以您可以通过NSKeyedArchiver调用数据归档程序,以获取描述数组的blob,然后将其存储到plist,如下所示:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"/Locations.plist"];
NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];

[data setValue:[NSKeyedArchiver archivedDataWithRootObject:arrayOfLocations] forKey:@"LocationList"];
[data writeToFile:path atomically:YES];
[data release];
瞧。就这么简单!:)

基于相同的原则,您可以通过NSKeyUnarchiver轻松获取数据:

我喜欢,但如果只想直接写入文件,序列化可能会更简单

[NSKeyedArchiver archiveRootObject:arrayOfLocations toFile:path];

分类代码工作得很好:它填充“keys”NSArray,但只要我执行[dict writeToFile:path automatically:YES];档案上什么也没写。如果你愿意,我已经用相关代码更新了我的问题。谢谢!好的,我又做了一些实验,我发现如果我在NSDictionary中包含key“clientLocation”的元素,它不会被写入plist文件,否则它会像一个符咒一样工作。这可能是因为该字段是一个包含大量字符的字符串。这是该元素的内容:好的,谜团解决了,我必须通过循环重新解析数据。我将发布另一个将我的代码与您的代码相结合的解决方案打得好。
- (void) addLocation {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"/Locations.plist"];

    NSArray *keys = [curLocation c_propertyNames]; // retrieve all the keys for this obj
    NSDictionary *values = [self.curLocation dictionaryWithValuesForKeys:keys];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    for(NSString *key in keys) {
        NSString *aaa = [NSString stringWithFormat:@"%@", (NSString *)[values valueForKey:key]];
        [dict setValue:aaa forKey:key];
    }

    [dict writeToFile:path atomically:YES];
}
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"/Locations.plist"];
NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: path];

[data setValue:[NSKeyedArchiver archivedDataWithRootObject:arrayOfLocations] forKey:@"LocationList"];
[data writeToFile:path atomically:YES];
[data release];
self.arrayOfLocations = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData: (NSData *)[dict objectForKey:@"LocationList"]]];
[NSKeyedArchiver archiveRootObject:arrayOfLocations toFile:path];