【问题标题】:Saving Custom NSArray Data to iPhone将自定义 NSArray 数据保存到 iPhone
【发布时间】:2015-09-10 03:46:57
【问题描述】:

我一直试图在本地(通过 NSUserDefaults) 保存用户创建的 PFGeoPoints 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 是一个 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 是一个包含多个PFGeoPoints 的列表。我要做的就是将此数组保存到设备中,这样用户就不必在每次用户加载应用程序时重新创建整个列表 (render)(我正在使用云数据...不要试图在数据上花费太多)。

如果有人可以为我提供有关如何将此数据保存为数组的建议/解决方案(而不是将每一行分解为整数以表示 lat 和 long),或者如果有人可以建议@987654330 的有用替代方案@ (可能像 Core Data 或其他一些本地存储) 我将不胜感激。谢谢

【问题讨论】:

  • 为什么不将数组作为 XML 文件保存在分配给应用程序的沙箱文件夹中?

标签: objective-c iphone arrays nsuserdefaults nsdata


【解决方案1】:

只需要实现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]; 

}

斯威夫特 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()
}

斯威夫特 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()
}

读取数组:

Obj-C

-(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:keyName];
    NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    [defaults synchronize];
    return myArray;  
}

斯威夫特 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
}

斯威夫特 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!
}

【讨论】:

    【解决方案2】:

    要将自定义对象保存为用户默认值,需要符合NSCoding协议(对象需要编码/解码)。

    您的自定义对象需要实现NSCoding 协议。

    一旦你遵循了 NSCoding 规则;像这样归档和保存数据:

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourArray];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"Key"];
    

    像这样取消归档:

    NSArray *array= [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"Key"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2011-09-26
      相关资源
      最近更新 更多