我正在尝试将一系列位置保存到NSUserDefaults。首先,我将CLLocationCoordinates转换为NSValues数组,使用NSUserDefaults进行保存。 到目前为止,这是我的代码:
_locationsArray = [[NSMutableArray alloc] init];
NSUInteger count = [self.locations count];
CLLocationCoordinate2D coordinates[count];
for (NSInteger i = 0; i < count; i++) {
coordinates[i] = [(CLLocation *)self.locations[i] coordinate];
NSValue *locationValue = [NSValue valueWithMKCoordinate:coordinates[i]];
[_locationsArray addObject:locationValue];
}
NSLog(@"location = %@", _locationsArray);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:totalDistance forKey:@"totalDistance"];
[defaults setObject:_locationsArray forKey:@"mapOverlay"];
// [defaults setDouble:_totalTime forKey:@"totalTime"];
[defaults setObject:avgSpeedToBeSaved forKey:@"averageSpeed"];
[defaults setObject:totalCalories forKey:@"totalCalories"];
[defaults synchronize];
但是我收到以下错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSUserDefaults setObject:forKey:]: attempt to insert non-property list object (
"<8b4df1d9 36ab4240 d5059bbe 47825ec0>",
"<f6dd639f 36ab4240 a2a7b7f5 49825ec0>",
"<f6dd639f 36ab4240 a2a7b7f5 49825ec0>",
"<20c46379 36ab4240 5ff02732 4c825ec0>",
"<20c46379 36ab4240 5ff02732 4c825ec0>",
"<d24c9c81 36ab4240 2bd75f9f 4e825ec0>",
"<d24c9c81 36ab4240 2bd75f9f 4e825ec0>",
"<d810b96c 36ab4240 f4d96401 51825ec0>",
"<d810b96c 36ab4240 f4d96401 51825ec0>"
) for key mapOverlay'
我认为如果我将坐标转换为NSValues,他们可以保存到NSUserDefaults - 是不是这样?我还应该怎么做呢?
答案 0 :(得分:0)
您需要实施NSCoding协议,如果您不知道该怎么做,请检查http://sam.roon.io/archiving-objective-c-objects-with-nscoding
希望能帮到你
答案 1 :(得分:0)
为什么要将NSMutableArray
保存到NSUserDefaults
。这不是保存数据的正确方法。
您应该将数据保存在plist
文件中。
[_locationsArray writeToFile:path atomically:YES];
从plist
文件中获取所有位置
_locationsArray=[NSMutableArray arrayWithContentsOfFile:path];
您也可以使用数据库。
答案 2 :(得分:0)
你可以做的一件事就是使用NSKeyedArchiver来设置你的数组并设置为userdefaults。当你想要使用NSKeyedUnarchiver读取相同的数据解析时。
答案 3 :(得分:0)
尝试保存值而不是对象。
[defaults setValue:(id) forKey:(NSString *)];
它有效,因为(id)基本上可以是“任何东西”,它不会崩溃。 :)
答案 4 :(得分:0)
它要求一个“属性列表对象”,它是NSDictionary / XML / Plist。尝试将其保存到字典中吗?
for (NSInteger i = 0; i < count; i++) {
coordinates[i] = [(CLLocation *)self.locations[i] coordinate];
NSValue *locationValue = [NSValue valueWithMKCoordinate:coordinates[i]];
[_locationsArray addObject:locationValue];
}
NSMutableDictionary *locationsDict = @{@"locationsArray": _locationsArray};
[defaults setObject:locationsDict forKey:@"mapOverlay"];
[defaults synchronize];
如果有效,请告诉我们:)