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 솔루션에 대한 개선 사항을 공유하고 싶습니다.
- 클래스 이름을 사용하여 개체를 저장할 텍스트 파일 이름을 생성 할 수 있습니다.
- viewWillDisappear 메서드에서 뷰 컨트롤러의 개체를 저장하고 viewDidLoad 메서드에서 복원하는 것은 좋은 솔루션입니다.
- 중복 코드를 피하기 위해 파일 이름은 별도의 방법으로 생성해야합니다.
- 객체를 복원 한 후에는 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
'Nice programing' 카테고리의 다른 글
rxjs 플랫 맵 누락 (0) | 2020.12.27 |
---|---|
이미지를 사용하기 위해 UITableView의 배경 (tableview 스타일은 "그룹화")을 어떻게 설정할 수 있습니까? (0) | 2020.12.27 |
Google Maps API가로드되었는지 확인하는 방법은 무엇입니까? (0) | 2020.12.26 |
부호없는 인덱스로 역방향 'for'루프를 수행하는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.26 |
PHP : 부모 클래스에서 자식 클래스의 함수를 호출하는 방법 (0) | 2020.12.26 |