objective-c - 将自定义 NSArray 数据保存到 iPhone

标签 objective-c iphone arrays nsuserdefaults nsdata

我一直在尝试在本地保存用户创建的PFGeoPoints (通过 NSUserDefaults)NSMutableArray。经过大量阅读和研究,我现在知道简单地保存带有自定义数据的数组坦率地说是不可能的。我尝试了以下几种不同的方法:

   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 是一个已创建并从 Parse 设置为 PFGeoPoints 的 NSMutableArray

我还尝试通过

NSMutableArray 转换为 NSData
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

,但这仍然不起作用。每次我不断收到错误,告诉我以下内容:

Property list invalid for format: 200 
(property lists cannot contain objects of type 'CFType')

我保存的 NSMutableArray 是一个包含多个 PFGeoPoint 的列表。我想做的就是将此数组保存到设备,以便用户每次加载应用程序时都不必重新创建(渲染)整个列表(我正在使用云数据...不想在数据上花费太多)。

如果有人可以帮助我提供有关如何将此数据保存为数组的建议/解决方案(而不是将每一行分解为纬度和经度的整数),或者如果有人可以建议一个有用的替代方案NSUserDefaults (可能像核心数据或其他一些本地存储) 我将非常感激。谢谢

最佳答案

只需实现NSCoding协议(protocol)

写入数组:

对象-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()
}

swift 3.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()
}

读取数组:

对象-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
}

swift 3.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!
}

关于objective-c - 将自定义 NSArray 数据保存到 iPhone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32492816/

相关文章:

iphone - 带有自定义字体的 UIFont 失败并返回 Nil

objective-c - 在 Swift 中将参数传递给 Objective C 类

iphone - Objective C - 隐藏 iVar

ios - 在 webview 中禁用/清除自动缓存...

ios - SOAP API 正在响应可选括号中的 XML。如何迎合它?

java - 数组索引越界异常(Java)

arrays - 为什么我可以调用 array.some() 而不是 array.every() 联合数组类型?

iphone - 从应用程序复制图像并将其粘贴到 iPhone 中的 native SMS 应用程序中

ios - 什么是 UIApplicationLinkedOnOrAfter,为什么它会杀死我的应用程序?

php - 为什么我不能立即访问展开的数组元素?