将自定义 NSArray 数据保存到 iPhone
Saving Custom NSArray Data to iPhone
我一直在尝试在本地保存 (通过 NSUserDefaults) 用户创建的 NSMutableArray
PFGeoPoints。经过大量阅读和研究,我现在知道简单地保存一个带有自定义数据的数组是不可能的。我以几种不同的方式尝试了以下方法:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *testArray = [[NSMutableArray alloc] init];
NSArray *checkArray = [[NSArray alloc] init];
testArray = locationList;
PFGeoPoint *test = [locationList objectAtIndex:0];
NSString *latString = [NSString stringWithFormat:@"%f",test.latitude];
[testArray insertObject:latString atIndex:0];
checkArray = testArray;
[defaults setValue:checkArray forKey:@"Locations"];
[defaults synchronize];
其中 locationList 是 NSMutableArray
已创建并从 Parse 设置为 PFGeoPoints。
我也曾尝试通过
将 NSMutableArray
转换为 NSData
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
,但这仍然没有用。每次我不断收到错误时告诉我以下内容:
Property list invalid for format: 200
(property lists cannot contain objects of type 'CFType')
我保存的NSMutableArray
是一个包含多个PFGeoPoint
的列表。我想要做的就是将这个数组保存到设备中,这样用户就不必在每次用户加载应用程序时重新创建 (render) 整个列表 (我正在使用云数据...不想花太多钱买数据)。
如果有人可以帮助我 suggestion/solution 如何将此数据保存为数组(而不是将每一行分解为纬度和经度的整数),或者如果有人可以提出有用的建议替代 NSUserDefaults
(比如 Core Data 或其他一些本地存储) 我将不胜感激。谢谢
要将自定义对象保存到用户默认值中,它需要符合 NSCoding
协议(对象需要 code/decode)。
您的自定义对象需要实施 NSCoding
协议。
一旦你遵循了 NSCoding 规则;像这样存档和保存数据:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourArray];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"Key"];
这样取消存档:
NSArray *array= [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"Key"];
只是你需要实施 NSCoding protocol
写入数组:
Obj-C
-(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];
[defaults setObject:data forKey:keyName];
[defaults synchronize];
}
Swift 2.3
func writeArrayWithCustomObjToUserDefaults(keyName: String, withArray myArray: [AnyObject]) {
var defaults = NSUserDefaults.standardUserDefaults()
var data = NSKeyedArchiver.archivedDataWithRootObject(myArray)
defaults.setObject(data, forKey: keyName)
defaults.synchronize()
}
Swift3.1
func writeArrayWithCustomObj(toUserDefaults keyName: String, withArray myArray: [Any]) {
let defaults = UserDefaults.standard
let data = NSKeyedArchiver.archivedData(withRootObject: myArray)
defaults.set(data, forKey: keyName)
defaults.synchronize()
}
读取数组:
Obj-C
-(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:keyName];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[defaults synchronize];
return myArray;
}
Swift 2.3
func readArrayWithCustomObjFromUserDefaults(keyName: String) -> [AnyObject] {
var defaults = NSUserDefaults.standardUserDefaults()
var data = defaults.objectForKey(keyName)!
var myArray = NSKeyedUnarchiver.unarchiveObjectWithData(data)!
defaults.synchronize()
return myArray
}
Swift3.1
func readArrayWithCustomObj(fromUserDefaults keyName: String) -> [Any] {
let defaults = UserDefaults.standard
let data: Data? = defaults.object(forKey: keyName)
let myArray: [Any]? = NSKeyedUnarchiver.unarchiveObject(with: data!)
defaults.synchronize()
return myArray!
}
我一直在尝试在本地保存 (通过 NSUserDefaults) 用户创建的 NSMutableArray
PFGeoPoints。经过大量阅读和研究,我现在知道简单地保存一个带有自定义数据的数组是不可能的。我以几种不同的方式尝试了以下方法:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *testArray = [[NSMutableArray alloc] init];
NSArray *checkArray = [[NSArray alloc] init];
testArray = locationList;
PFGeoPoint *test = [locationList objectAtIndex:0];
NSString *latString = [NSString stringWithFormat:@"%f",test.latitude];
[testArray insertObject:latString atIndex:0];
checkArray = testArray;
[defaults setValue:checkArray forKey:@"Locations"];
[defaults synchronize];
其中 locationList 是 NSMutableArray
已创建并从 Parse 设置为 PFGeoPoints。
我也曾尝试通过
将NSMutableArray
转换为 NSData
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
,但这仍然没有用。每次我不断收到错误时告诉我以下内容:
Property list invalid for format: 200
(property lists cannot contain objects of type 'CFType')
我保存的NSMutableArray
是一个包含多个PFGeoPoint
的列表。我想要做的就是将这个数组保存到设备中,这样用户就不必在每次用户加载应用程序时重新创建 (render) 整个列表 (我正在使用云数据...不想花太多钱买数据)。
如果有人可以帮助我 suggestion/solution 如何将此数据保存为数组(而不是将每一行分解为纬度和经度的整数),或者如果有人可以提出有用的建议替代 NSUserDefaults
(比如 Core Data 或其他一些本地存储) 我将不胜感激。谢谢
要将自定义对象保存到用户默认值中,它需要符合 NSCoding
协议(对象需要 code/decode)。
您的自定义对象需要实施 NSCoding
协议。
一旦你遵循了 NSCoding 规则;像这样存档和保存数据:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourArray];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"Key"];
这样取消存档:
NSArray *array= [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"Key"];
只是你需要实施 NSCoding protocol
写入数组:
Obj-C
-(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];
[defaults setObject:data forKey:keyName];
[defaults synchronize];
}
Swift 2.3
func writeArrayWithCustomObjToUserDefaults(keyName: String, withArray myArray: [AnyObject]) {
var defaults = NSUserDefaults.standardUserDefaults()
var data = NSKeyedArchiver.archivedDataWithRootObject(myArray)
defaults.setObject(data, forKey: keyName)
defaults.synchronize()
}
Swift3.1
func writeArrayWithCustomObj(toUserDefaults keyName: String, withArray myArray: [Any]) {
let defaults = UserDefaults.standard
let data = NSKeyedArchiver.archivedData(withRootObject: myArray)
defaults.set(data, forKey: keyName)
defaults.synchronize()
}
读取数组:
Obj-C
-(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:keyName];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[defaults synchronize];
return myArray;
}
Swift 2.3
func readArrayWithCustomObjFromUserDefaults(keyName: String) -> [AnyObject] {
var defaults = NSUserDefaults.standardUserDefaults()
var data = defaults.objectForKey(keyName)!
var myArray = NSKeyedUnarchiver.unarchiveObjectWithData(data)!
defaults.synchronize()
return myArray
}
Swift3.1
func readArrayWithCustomObj(fromUserDefaults keyName: String) -> [Any] {
let defaults = UserDefaults.standard
let data: Data? = defaults.object(forKey: keyName)
let myArray: [Any]? = NSKeyedUnarchiver.unarchiveObject(with: data!)
defaults.synchronize()
return myArray!
}