2011-03-24 2 views
55

gestureRecognizer 개의 개체가있는 사용자 지정 개체 인 UIImageView 하위 클래스가 있습니다.iOS에서 맞춤 개체를 저장/직렬화하는 올바른 방법

NSMutableArray에 저장된 이러한 개체가 여러 개있는 경우 사용자가 앱을 다시 실행할 때로드 될 수 있도록이 개체 배열을 디스크에 저장하는 방법은 무엇입니까?

디스크에서 배열을로드하고 개체를 사용하고 싶습니다.

답변

116

비슷한에 대한 나의 구현은 다음과 완벽하게 작동입니다 :

사용자 정의 개체 (설정) 프로토콜을 구현해야합니다 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]; 
+4

이것은 더 많은 표를 가져야합니다. 완벽한 솔루션과 정말 나를 도왔습니다. 감사! – ChrisC

+4

FYI : 커스텀 객체가'NSCoding'을 따르고'initWithCoder :'와'encodeWithCoder :'를 구현하는 한, 이것을 보관시 루트 객체로 사용할 수 있습니다. 이 코드에서와 같이 NSMutableArray에 넣을 필요가 없습니다. –

+2

FYI : NSKeyedArchiver 및 NSCoding의 방법과시기, 이유에 대한 자세한 정보가 필요하면 http://nshipster.com/nscoding/에서 살펴보십시오. – haxpor

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

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

Official References.

배열에 사용자 정의 객체 유형이 포함되어있는 경우이 유형이 NSCoding Protocol을 준수하는지 확인해야 작동합니다.

+1

감사합니다. 그래서 배열에 상관없이 저장 될 때 배열을 반환해야합니다? 배열 항목을 검색하고 사용할 수 있습니까? – jarryd

+0

내가 잘못하고있을 수도 있지만이 간단한 코드는 사용자 지정 개체에 대해 작동하지 않는다고 생각합니다. 두 메서드 모두 'No'를 반환합니다. – Deco

+2

@Deco - 사용자 지정 개체 유형은 [NSCoding Protocol] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html)에서 확인해야합니다. 이게 작동합니다. – aroth

2

someb 만약 내가, 코스타스 솔루션 내 개선 사항을 공유하고 싶습니다 ody는 그들을 필요로합니다.

  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; 
} 
관련 문제