如何将自定义对象保存在包含更多自定义对象的数组中

Posted

技术标签:

【中文标题】如何将自定义对象保存在包含更多自定义对象的数组中【英文标题】:How to save custom objects inside of an array that holds more custom objects 【发布时间】:2013-11-03 21:54:33 【问题描述】:

我有一个这样分解的数组:

PersonArray
    PersonObject
       1. NSstring (personsName)
       2. NSMutableArray (EventsObject)

我可以用下面的代码保存这个数组:

NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:mutableDataArray.count];
for (BC_Person *personObject in mutableDataArray)

    NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
    [archiveArray addObject:personEncodedObject];


NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:archiveArray forKey:@"personDataArray"];
[userData synchronize];

我坚持的是:如果我将一个对象添加到Person 对象内的NSMutableArray,我是否还必须将该对象数组 (EventsObject) 转换为 NSData

(我想我会这样做,但我似乎无法弄清楚如何定位该对象数组 (EventsObject) 以在 PersonArray 内进行转换。

我希望我以易于理解的方式解释这一点。

【问题讨论】:

【参考方案1】:

NSArray 和其他一些类实现了NSCoding 协议。因此,您可以将代码简化为:

NSData *personData = [NSKeyedArchiver archivedDataWithRootObject:mutableDataArray];
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:personData forKey:@"personDataArray"];
[userData synchronize];

对于要归档的任何对象,您都需要实施NSCoding 协议。所以对于BC_Person,它可能看起来像这样(我不知道这个类,所以我以一些属性为例):

- (void)encodeWithCoder:(NSCoder *)encoder 

    [encoder encodeObject:self.firstName forKey:@"firstName"];
    [encoder encodeObject:self.lastName forKey:@"lastName"];
    [encoder encodeObject:self.eventObjects forKey:@"eventObjects"];

在此示例中,self.eventObjects 将是您的 EventsObject 类的对象数组。数组知道如何对自己进行编码,对于EventsObject,您需要实现另一个-encodeWithCoder: 方法。

要取消存档,您需要反转该过程。

【讨论】:

以上是关于如何将自定义对象保存在包含更多自定义对象的数组中的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 如何将自定义对象数组转换为 JSON

如何使用处理 Java 库将自定义形状数组和字符串数组合并到 JSON 对象中

将自定义对象存储到 Android 内部存储的最佳方式?

如何将自定义视图拖动为 Xcode 6 中自定义视图的私有属性

Swift中自定义对象和自定义对象数组的通用属性[重复]

将自定义对象转换为要保存在 NSUserDefauts 中的数据