在目标 C 中归档多个对象并将它们作为对象数组取消归档

Posted

技术标签:

【中文标题】在目标 C 中归档多个对象并将它们作为对象数组取消归档【英文标题】:Archiving Multiple Objects and Unarchiving them as array of objects in objective C 【发布时间】:2014-05-07 22:27:25 【问题描述】:

我在整个程序中的不同时间调用函数 archiveQueue 来存储 MYJSON 类型的对象,现在我想恢复我迄今为止存储在一个数组中的所有内容。

以下是我用来存储对象的函数:

- (void)archiveQueue:(MYJSON *)msg

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:msg];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *file = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"myqueue.txt"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager createFileAtPath:file contents:data attributes:nil];
    NSLog(@"ArchiveQueue: file = %@", file);


以下是我用来恢复对象的功能。

- (void)restoreQueue 


    NSLog(@"RestoreQueue: Restoring queue from Document Directory.");
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *file = [[paths objectAtIndex:0]  stringByAppendingPathComponent: @"myqueue.txt"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSData *data = [fileManager contentsAtPath:file];


        // How to unarchive that array of objects being stored. 


我想知道我应该如何解压缩存储为对象数组的所有内容?

【问题讨论】:

如果你在处理 json 为什么不直接保存为 json? 由于项目的一些要求,我不允许保存为json。 我很困惑。 jsonObject 不是你解压后存储的数据吗? Okie Chuck !对不起,我现在删除了那行。我只想恢复我通过 NSKeyArchiver 存储的所有对象。 createFileAtPath:contents:attributes: 将覆盖之前在该位置的所有内容。你总是会得到一个对象。 【参考方案1】:

为了使用 NSKeyedArchiver 保存自定义类,该类需要实现 NSCoding 协议。即使您的类实例作为NSArrayNSDictionary 的成员包含在内,您也需要让它们符合。

使用createFileAtPath:contents:attributes: 将覆盖该文件的内容。

这里有一些选项:

每次归档一组对象。

get an array of all objects
add your new object
write that array to disk

将对象归档到目录中的唯一文件

documents/mySpecialObjects/A.myObject
documents/mySpecialObjects/B.myObject
documents/mySpecialObjects/C.myObject
...

create local NSMutableArray
enumerate all files inside of documents/mySpecialObjects
unarchive each file and add to your array

【讨论】:

但它会创建许多我想附加到现有文件并获取数组中的数据的文件。 @NileshAgrawal 再次阅读第一个选项 :)

以上是关于在目标 C 中归档多个对象并将它们作为对象数组取消归档的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中的 DocumentDirectory 中归档和取消归档数组

从 iCloud 文件中取消归档对象时出错

归档后比较对象

移动非归档文件并将它们的属性设置为归档在目标目录中

目标 C:归档 NSDate 时遇到问题

如何在 BigQuery 中取消嵌套多个数组?