在 iOS 中保存 NSMutableArray

Posted

技术标签:

【中文标题】在 iOS 中保存 NSMutableArray【英文标题】:Save NSMutableArray in iOS 【发布时间】:2016-02-02 18:46:40 【问题描述】:

我需要用我的自定义对象保存许多 NSMutableArray,我想知道执行此操作的最佳方法是什么。

也许 NSUserDefaults 不是最好的方法。

我应该使用什么?

【问题讨论】:

【参考方案1】:

如果您的数组包含 非 plist 对象,then you cannot use NSUserDefaults without first encoding the array.

value 参数只能是属性列表对象:NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象。

您需要对其进行编码 using NSKeyedArchiver 这将为您提供一个 NSData 对象,然后您可以将其存储在 NSUserDefaults 中,或者通过 NSKeyedArchiver 本身将其写入文件.

您所要做的就是在您的自定义对象中符合NSCoding,并在加载时覆盖initWithCoder: 来初始化您的对象,并在编码时覆盖encodeWithCoder: 来编码您的变量。例如,您的自定义对象将如下所示:

@interface customArrayObject : NSObject <NSCoding>

@property (nonatomic) NSString* foo;

@property (nonatomic) NSInteger bar;

@end

@implementation customArrayObject

-(instancetype) initWithCoder:(NSCoder *)aDecoder  // decode variables
    if (self = [super init]) 
        _foo = [aDecoder decodeObjectForKey:@"foo"];
        _bar = [aDecoder decodeIntegerForKey:@"bar"];
    
    return self;


-(void) encodeWithCoder:(NSCoder *)aCoder  // encode variables
    [aCoder encodeObject:_foo forKey:@"foo"];
    [aCoder encodeInteger:_bar forKey:@"bar"];


@end

还值得注意的是,NSUserDefaults 用于存储用户首选项,因此如果您的数组包含与用户偏好,您不应该使用NSUserDefaults - 您应该自己将其写入磁盘。

将阵列写入磁盘实际上比听起来要简单得多,您可以在NSKeyedArchiver 上使用archiveRootObject:toFile: 方法。例如,这会将您的自定义数组写入文档目录:

// Gets the documents directory path
NSString* documentsPath = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES)[0];

// Archive and save the file to foo.dat in the documents directory. Returns whether the operation was successful.
BOOL success = [NSKeyedArchiver archiveRootObject:customArray toFile:[NSString stringWithFormat:@"%@/%@", documentsPath, @"foo.dat"]]

不过,同样值得注意的是,这个关于操作是否成功的平面(是/否)在错误处理方面并没有那么好。如果你想实现自定义错误处理,那么您需要先使用NSKeyedArchiverarchivedDataWithRootObject: 方法对对象进行编码,然后再使用NSDatawriteToFile:options:error: 方法对对象进行编码。

【讨论】:

NSKeyedArchiver 有一种直接归档到文件的方法,因此您不妨使用它,而不是将其转换为数据,然后在单独的调用中写入文件。 确实如此!以前从未见过...我会在几秒钟内更新我的答案。虽然,我个人还是更喜欢使用NSData 方法,因为它有更多的错误处理空间。 NSKeyedArchiver 只是返回一个是或否来表示它是否有效。 没错,虽然writeToFile:atomically 也只返回是/否。如果您需要更具体的错误信息,请使用 writeToFile:options:error: @dan 是的,为了简单起见,我只是在答案中使用它;) 自动处​​理的对象不是“非自定义”,而是称为plist(对象)。有大量 Apple 制作的课程无法由 NSUserDefault 处理。 (原因是,用户默认的文件表示是一个 XML plist。)

以上是关于在 iOS 中保存 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章

iOS 将照片保存在特定应用的相册中

在 iOS 应用中保存和显示视频。

在 iOS 中保存之前旋转图像

在 iOS 中保存访问令牌的最佳实践

如何在 iOS 中将照片保存在特定相册中

如何在 IOS 中保存新令牌照片