如何保存不是属性列表对象的Objective-C对象,或者有更好的方法比属性列表更好?

cra*_*rho 6 properties objective-c save plist

我正在写一本Cookbook应用程序,但是我找不到任何关于如何保存我创建的类(Recipe类)数据的内容.我见过的唯一方法是可以保存这个类的内容作为一个整体,而不是通过为我的Recipe类创建这个方法来为每个对象单独保存类的每个元素:

-(void) writeToFile:(NSString *)file atomically:(BOOL)atomic{

}
Run Code Online (Sandbox Code Playgroud)

但我完全不知道如何使用此方法将此对象保存到文件中.一些属性是:

NSString* name;
UIImage* recipePicture;
NSDate* dateAdded;
NSMutableArray* ingredients; //The contents are all NSStrings.
Run Code Online (Sandbox Code Playgroud)

有谁知道如何保存Recipe类的对象?这让我疯狂,无法弄明白.任何帮助将不胜感激.我已经有一个名为"RecipeData.plist"的.plist.我是否只需要将每个属性写入plist并在运行时使用这些属性初始化一个新的配方对象?

til*_*arr 5

采用:

@interface Recipe : NSObject<NSCoding>
Run Code Online (Sandbox Code Playgroud)

实行:

- (void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeObject:name_ forKey:@"name"];
    [coder encodeObject:recipePicture_ forKey:@"recipePicture"];
    [coder encodeObject:dateAdded_ forKey:@"dateAdded"];
    [coder encodeObject:ingredients_ forKey:@"ingredients"];
Run Code Online (Sandbox Code Playgroud)

}

// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super init];
    if (self!=NULL)
    {
       name_ = [coder decodeObjectForKey:@"name"];
       recipePicture_ = [coder decodeObjectForKey:@"recipePicture"];
       dateAdded_ = [coder decodeObjectForKey:@"dateAdded"];
       ingredients_ = [coder decodeObjectForKey:@"ingredients"];   
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

现在保存:

- (void) save:(NSString*)path recipe:(Recipe*)recipe
{
    NSMutableData* data=[[NSMutableData alloc] init];
    if (data)
    {
        NSKeyedArchiver* archiver=[[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        if (archiver)
        {
            [archiver encodeInt:1 forKey:@"Version"];
            [archiver encodeObject:recipe forKey:@"Recipe"];
            [archiver finishEncoding];

            [data writeToFile:path atomically:YES];

        }
     }
 }
Run Code Online (Sandbox Code Playgroud)

并在负载:

- (Recipe*) load:(NSString*)path
{
    Recipe* ret=NULL;
    NSData* data=[NSData dataWithContentsOfFile:path];
    if (data)
    {
        NSKeyedUnarchiver* unarchiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        if (unarchiver)
        {
            int version=[unarchiver decodeIntForKey:@"Version"];
            if (version==1)
            {
                 ret=(Recipe*)[unarchiver decodeObjectForKey:@"Recipe"];
            }
            [unarchiver finishDecoding];
        }
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)