iOS 복합 객체의 아카이빙 및 역아카이빙

5534 단어

아카이빙 및 역아카이빙

  • 복잡한 대상은Foundation 프레임워크에 존재하지 않는 데이터 클래스, 예를 들어 우리가 정의한Person 클래스이다.
  • 복잡한 대상은 writeToFile:의 방법으로 데이터를 지속할 수 없고 복잡한 대상을 NSData(이 단계는 압축 파일)로 전환한 다음writeToFile:파일을 통해 쓸 수 있습니다.
  • 복잡한 객체가 파일을 쓰는 프로세스(파일 읽기 -> 아카이브 -> NSData->writeToFile)입니다.
  • 파일에서 NSData 데이터를 읽고 NSData를 복잡한 객체로 변환(이 단계는 역아카이브)
  • 파일에서 복잡한 객체를 읽는 과정(파일 읽기->NSData->역아카이브->복잡한 객체 읽기)
  • 준비 작업


    우선 복잡한 대상이 속한 클래스는 협의를 준수해야 한다.그리고 협의 중의 두 가지 방법을 실현한다
  • 압축 파일(서열화) 시 호출하는 방법
  • -(void)encodeWithCoder:(NSCoder *)aCoder;
    
  • 역압축 파일(반서열화) 시 호출하는 방법
  • -(nullable instancetype)initWithCoder:(NSCoder *)aDecoder;
    
  • NSCoding 프로토콜 준수
  • @interface Archiver : NSObject
    @property (strong, nonatomic)NSString *name;
    @property (assign, nonatomic)NSInteger age;
    @property (strong, nonatomic)NSString *address;
    @property (strong, nonatomic)UIImage *photo;
    @end
    
  • 협의를 실현하는 두 가지 방법
  • -(void)encodeWithCoder:(NSCoder *)aCoder{
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeInteger:self.age forKey:@"age"];
        [aCoder encodeObject:self.address forKey:@"address"];
        [aCoder encodeObject:self.photo forKey:@"photo"];
    }
    
    -(instancetype)initWithCoder:(NSCoder *)aDecoder{
        if (self = [super init]) {
            self.name = [aDecoder decodeObjectForKey:@"name"];
            self.age = [aDecoder decodeIntegerForKey:@"age"];
            self.address = [aDecoder decodeObjectForKey:@"address"];
            self.photo = [aDecoder decodeObjectForKey:@"photo"];
        }return self;
    }
    
  • 주의: 대상을 압축하여 반칙을 할 때 우리는 서로 다른 데이터 유형에 대해 그와 일치하는 압축파일과 반압축파일 방법을 채택해야만 압축파일과 반압축파일을 성공적으로 진행할 수 있다.
  • 파일 경로를 가져오는 방법
  • -(NSString *)GetThefilePath:(NSString *)filePath{
        NSString *Path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
    NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:filePath];
        return Path;
    }
    

    여러 객체를 동시에 아카이빙


    분류하여 보존하다

  • 데이터 준비
  • CGPoint point = CGPointMake(1.0, 2.0);
        NSString *info = @"    ";
        NSInteger value = 10;
    
  • 저장할 파일 경로 가져오기
  •   NSString *multiHome = [self GetThefilePath:@"multi.archiver"];
    
  • 아카이브된 객체를 저장할 NSMutable Data 준비
  • NSMutableData *data = [[NSMutableData alloc] init];
    
  • 아카이브 만들기 도구
  • NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    
  • 아카이브를 수행할 때는 키-값에 해당하는 관계식에 따라 객체를 NSData 유형의 데이터로 변환합니다.
  • [archiver encodeCGPoint:point forKey:@"kPoint"];
    [archiver encodeObject:info forKey:@"kInfo"];
    [archiver encodeInteger:value forKey:@"kValue"];
    
  • 아카이브 종료
  • [archiver finishEncoding];
    
  • 데이터를 파일에 쓰는 것이야말로 데이터에 대한 지속적인 유지이다.
  • [data writeToFile:multiHome atomically:YES];
    

    역압축 파일

  • 파일에서 NSData 데이터(즉 아카이빙된 데이터)를 읽습니다
  • .
    NSMutableData *datR = [[NSMutableData alloc]initWithContentsOfFile:
    [self GetThefilePath:@"multi.archiver"]];
    
  • 역아카이브 만들기 도구
  •  NSKeyedUnarchiver *unchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:datR];
    
  • 압축 해제 주의: 어떤 유형의 대상이 어떤 유형의 방법으로 압축 해제를 해야 하는지, 같은 유형의 대상이 접수해야 한다
  • CGPoint point = [unchiver decodeCGPointForKey:@"kPoint"];
    NSString *info = [unchiver decodeObjectForKey:@"kInfo"];
    NSInteger value = [unchiver decodeIntegerForKey:@"kValue"];
    
  • 역아카이브 종료
  • [unchiver finishDecoding];
    

    사용자 정의 클래스에 대한 압축 및 반압축


    분류하여 보존하다

  • 데이터 준비
  • NSString *name = @"  ";
        NSInteger age = 22;
        NSString *address = @"  ";
        UIImage *photo = [UIImage imageNamed:@"5.png"];
        Archiver *archiver = [[Archiver alloc]init];
        archiver.name = name;
        archiver.age = age;
        archiver.address = address;
        archiver.photo = photo;
    
  • 아카이브된 객체를 저장할 NSMutable Data 준비
  • NSMutableData *data = [[NSMutableData alloc]init];
    
  • 아카이브 만들기 도구
  • NSKeyedArchiver *archive = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    
  • 아카이브를 수행할 때는 키-값에 해당하는 관계식에 따라 객체를 NSData 유형의 데이터로 변환합니다.
  • [archive encodeObject:archiver forKey:@"arc"];
    
  • 아카이브 종료
  • [archive finishEncoding];
    
  • 데이터를 파일에 쓰는 것이야말로 데이터에 대한 지속적인 유지이다.
  • [data writeToFile:[self GetThefilePath:@"archiver.archiver"] atomically:YES];
    

    역압축 파일

  • 파일에서 NSData 데이터(즉 아카이빙된 데이터)를 읽습니다
  • .
    NSMutableData *data = [[NSMutableData alloc]initWithContentsOfFile:
    [self GetThefilePath:@"archiver.archiver"]];
    
  • 역아카이브 만들기 도구
  • NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
    
  • 압축 해제 주의: 어떤 유형의 대상이 어떤 유형의 방법으로 압축 해제를 해야 하는지, 같은 유형의 대상이 접수해야 한다
  • Archiver *arch = [unarchiver decodeObjectForKey:@"arc"];
    
  • 역아카이브 종료
  • [unarchiver finishDecoding];
    

    좋은 웹페이지 즐겨찾기