在iOS

时间:2016-02-02 18:46:40

标签: ios objective-c save nsmutablearray

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

也许NSUserDefaults不是最好的方法。

我应该使用什么?

1 个答案:

答案 0 :(得分:2)

如果您的数组包含非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 - 您应该自己将其写入磁盘。

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

// 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"]]

但是,值得注意的是,关于操作是否成功,这个单元(是/否)在错误处理方面并不是那么好。如果要实现自定义错误处理,然后您将首先使用NSKeyedArchiver的{​​{1}}方法,然后使用archivedDataWithRootObject:的{​​{1}}方法对对象进行编码。