经过几个小时的搜索,我已经弄清楚了整个场景。在这里,您有几个解决方案;第一个更“脏”,因为这是我想出的第一个,而第二个更优雅。无论如何,我会把它们都留下,因为也许它们都可以派上用场。
解决方案 — 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 中的所有数据转换为 NSStrings,以便它们可以毫无问题地写入 plist 文件,如果你只是制作字典然后尝试立即保存它,你不会成功.
通过这种方式,我可以将所有 CLLocation obj“序列化”成一个字典,然后写入一个 plist 文件。
解决方案 — 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轻松取回数据:
self.arrayOfLocations = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData: (NSData *)[dict objectForKey:@"LocationList"]]];