UFO ET IT

iOS에서 사용자 지정 개체를 저장 / 직렬화하는 올바른 방법

ufoet 2020. 12. 28. 21:45
반응형

iOS에서 사용자 지정 개체를 저장 / 직렬화하는 올바른 방법


UIImageView몇 개의 gestureRecognizer개체 가있는 하위 클래스 인 사용자 지정 개체 있습니다.

에 이러한 개체가 여러 개 저장되어있는 NSMutableArray경우 사용자가 앱을 다시 실행할 때로드 할 수 있도록이 개체 배열을 디스크에 어떻게 저장합니까?

디스크에서 어레이를로드하고 개체를 사용하고 싶습니다.


비슷한 것에 대한 내 구현은 다음과 같으며 완벽하게 작동합니다.

커스텀 객체 (Settings)는 NSCoding 프로토콜을 구현해야합니다.

-(void)encodeWithCoder:(NSCoder *)encoder{
    [encoder encodeObject:self.difficulty forKey:@"difficulty"];
    [encoder encodeObject:self.language forKey:@"language"];
    [encoder encodeObject:self.category forKey:@"category"];
    [encoder encodeObject:self.playerType forKey:@"playerType"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
        self.difficulty = [decoder decodeObjectForKey:@"difficulty"];
        self.language = [decoder decodeObjectForKey:@"language"];
        self.category = [decoder decodeObjectForKey:@"category"];
        self.playerType = [decoder decodeObjectForKey:@"playerType"];
    }
    return self;
}

다음 코드는 사용자 지정 개체를 파일 (set.txt)에 작성한 다음 myArray 배열에 복원합니다.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"set.txt"];

NSMutableArray *myObject=[NSMutableArray array];
[myObject addObject:self.settings];    

[NSKeyedArchiver archiveRootObject:myObject toFile:appFile]; 

NSMutableArray* myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:appFile]; 

//store the array
[NSKeyedArchiver archiveRootObject:myArray toFile:@"someFile"];

//load the array
NSMutableArray* myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:@"someFile"];

공식 참조 .

배열에 사용자 지정 개체 유형이 포함 된 경우 이것이 작동하기 전에 유형이 NSCoding 프로토콜을 준수하는지 확인해야합니다 .


이 블로그 게시물은 NSKeyedArchiver를 사용하여 사용자 지정 개체 배열을 디스크에 저장하고 NSKeyedUnarchiver로 다시 읽는 방법을 설명합니다 .

http://www.cocoabuilder.com/archive/cocoa/240775-saving-nsarray-of-custom-objects.html

Apple은 또한 문제에 대한 매우 유용한 가이드 인 Archives and Serializations Programming Guide를 제공 합니다.


누군가 필요한 경우 Kostas 솔루션에 대한 개선 사항을 공유하고 싶습니다.

  1. 클래스 이름을 사용하여 개체를 저장할 텍스트 파일 이름을 생성 할 수 있습니다.
  2. viewWillDisappear 메서드에서 뷰 컨트롤러의 개체를 저장하고 viewDidLoad 메서드에서 복원하는 것은 좋은 솔루션입니다.
  3. 중복 코드를 피하기 위해 파일 이름은 별도의 방법으로 생성해야합니다.
  4. 객체를 복원 한 후에는 nil이 아닌지 확인해야합니다.

- (void)viewDidLoad
{
  [super viewDidLoad];

  // Restoring form object from the file
  NSString *formFilePath = [self formFilePath];
  RRCreateResumeForm *form = [NSKeyedUnarchiver unarchiveObjectWithFile:formFilePath];
  if (form != nil) {
    self.formController.form = form;
  }
}


- (void)viewWillDisappear:(BOOL)animated
{
  [super viewWillDisappear:animated];

  // Saving the form object to the file
  NSString *formFilePath = [self formFilePath];
  [NSKeyedArchiver archiveRootObject:self.formController.form toFile:formFilePath];
}


// Returns a file path to the file with stored form data for form controller
- (NSString *)formFilePath
{
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [paths objectAtIndex:0];
  NSString *formClassName = NSStringFromClass( [self.formController.form class] );
  NSString *formFileName = [NSString stringWithFormat:@"%@.txt", formClassName];
  NSString *formFilePath = [documentsDirectory stringByAppendingPathComponent:formFileName];

  return formFilePath;
}

ReferenceURL : https://stackoverflow.com/questions/5413851/correct-way-to-save-serialize-custom-objects-in-ios

반응형