iOS开发之归档

来源:互联网 发布:淘宝英文店铺名字大全 编辑:程序博客网 时间:2024/04/29 10:03

iOS开发中,我们可能需要将一些内存中的数据存储到本地中,以便下次进入程序的时候使用,这个时候我们就需要归档,其实,就是将一些对象进行编码保存到磁盘中,然后再使用的时候再对这些数据进行解码,然后使用。涉及到的类为NSKeyedArchiver和NSKeyedUnarchiver。下面我们来看一个例子,例如我们从服务器上取到了一些xml数据,然后经过解析之后,我们可能想要把解析出来的数据保存到硬盘中,这个时候,我们就得创建一个相对应的实体类来保存数据,这时候这个类就需要遵循NSCoding协议,并实现协议中的两个方法:

- (void)encodeWithCoder:(NSCoder *)aCoder;

- (id)initWithCoder:(NSCoder *)aDecoder;

#import<Foundation/Foundation.h>


@interface Info :NSObject<NSCoding>{

   NSString *infoID;

   NSString *infoName;

   NSString *infoImage;

   NSString *infoArtist;

}

@property(nonatomic,copy)NSString *infoID;

@property(nonatomic,copy)NSString *infoName;

@property(nonatomic,copy)NSString *infoImage;

@property(nonatomic,copy)NSString *infoArtist;


@end


#import"Info.h"

@implementation Info

@synthesize infoID,infoName,infoImage,infoArtist;


-(void)encodeWithCoder:(NSCoder *)aCoder{

    [aCoderencodeObject:infoIDforKey:@"infoID"];

    [aCoderencodeObject:infoNameforKey:@"infoName"];

    [aCoderencodeObject:infoImageforKey:@"infoImage"];

    [aCoderencodeObject:infoArtistforKey:@"infoArtist"];

}

-(id)initWithCoder:(NSCoder *)aDecoder{

   if (self=[superinit]) {

       self.infoID=[aDecoderdecodeObjectForKey:@"infoID"];

       self.infoName=[aDecoderdecodeObjectForKey:@"infoName"];

       self.infoImage=[aDecoderdecodeObjectForKey:@"infoImage"];

       self.infoArtist=[aDecoderdecodeObjectForKey:@"infoArtist"];

    }

   return self;

}


@end

这样,以后我们在需要将info对象保存到硬盘中的时候,就可以使用下面的方式:

 NSMutableData *archiveData=[NSMutableDatadata];

   NSKeyedArchiver *archiver=[[NSKeyedArchiveralloc]initForWritingWithMutableData:archiveData];

    [archiverencodeObject:infoArrayforKey:@"pInfoArray"];

    [archiverfinishEncoding];

   NSString *document=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)objectAtIndex:0];

   NSString *filePath=[documentstringByAppendingPathComponent:@"storeFile"];

    [archiveDatawriteToFile:filePath atomically:YES];

而在需要使用这些数据的时候就可以:

NSString *document=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)objectAtIndex:0];

   NSString *storeFile=[document stringByAppendingPathComponent:@"storeFile"];

   if ([[NSFileManagerdefaultManager] fileExistsAtPath:storeFile]) {

       NSData *data=[NSDatadataWithContentsOfFile:storeFile];

       if ([data length]>0) {

           NSKeyedUnarchiver *Unarchiver=[[NSKeyedUnarchiveralloc] initForReadingWithData:data];

           NSArray *array=[Unarchiver decodeObjectForKey:@"pInfoArray"];

            [UnarchiverfinishDecoding];

            [Unarchiverrelease];

           for (int i=0;i<[arraycount]; i++) {                     Info *tempInfo=[array objectAtIndex:i];

      ...

            }

        }

    }


以上这些过程就是iOS的归档和反归档的过程。