[英]Swift 4: Save and retrieve an array of custom objects (with nested custom objects) to UserDefaults
[英]How to save custom objects inside of an array that holds more custom objects
我有一個分解成這樣的數組:
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
。
我希望我以一種易於理解的方式對此進行解釋。
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:
方法。
要取消存檔,您可以逆轉該過程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.