2011-03-24 25 views
55

Tôi có một đối tượng tùy chỉnh, một lớp con UIImageView có một số đối tượng gestureRecognizer.Cách đúng để lưu/tuần tự hóa các đối tượng tùy chỉnh trong iOS

Nếu tôi có một số đối tượng được lưu trữ trong một NSMutableArray, thì mảng đối tượng này sẽ được lưu vào đĩa sao cho nó có thể được tải khi người dùng chạy lại ứng dụng?

Tôi muốn tải mảng từ đĩa và sử dụng các đối tượng.

bài

Trả lời

116

thực hiện của tôi cho một cái gì đó tương tự như sau và hoạt động hoàn hảo:

Đối tượng tùy chỉnh (Settings) nên thực hiện các giao thức 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; 
} 

Các mã sau đây viết đối tượng tùy chỉnh vào một tập tin (set.txt) và sau đó khôi phục nó vào mảng 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

Điều này sẽ có nhiều phiếu bầu hơn. Giải pháp hoàn chỉnh và thực sự giúp tôi. Cảm ơn! – ChrisC

+4

FYI: Miễn là đối tượng tùy chỉnh của bạn tuân thủ 'NSCoding' và triển khai' initWithCoder: 'và' encodeWithCoder: ', bạn có thể sử dụng nó làm đối tượng gốc khi lưu trữ. Không cần phải đặt nó trong một 'NSMutableArray' như trong mã này. –

+2

FYI: Hãy xem http://nshipster.com/nscoding/ nếu bạn muốn biết thêm thông tin về cách thức, thời điểm và lý do của NSKeyedArchiver và NSCoding. – haxpor

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

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

Official References.

Lưu ý rằng khi mảng chứa các loại đối tượng tùy chỉnh, bạn phải đảm bảo loại của bạn phù hợp với NSCoding Protocol trước khi điều này sẽ hoạt động.

+1

Cảm ơn. Vì vậy, điều này sẽ trả về mảng như nó đã được lưu, không có vấn đề gì trong mảng? Các mục mảng có thể truy xuất được và có thể sử dụng được không? – jarryd

+0

Tôi chỉ có thể làm sai, nhưng tôi không nghĩ rằng mã này hoạt động đơn giản cho các đối tượng tùy chỉnh, cả hai phương thức đều trả về 'Không'. – Deco

+2

@Deco - Các loại đối tượng tùy chỉnh phải xác nhận với [Giao thức NSCoding] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html) cho điều này để làm việc. – aroth

2

Tôi muốn chia sẻ các cải tiến của mình với giải pháp Kostas, nếu someb ody cần chúng.

  1. Tên lớp có thể được sử dụng để tạo tên tệp văn bản để lưu trữ đối tượng.
  2. Đó là một giải pháp tốt để lưu các đối tượng của bộ điều khiển chế độ xem trong phương thức viewWillDisappear và khôi phục chúng trong phương thức viewDidLoad.
  3. Tên tệp phải được tạo theo phương pháp riêng biệt để tránh mã trùng lặp.
  4. Sau khi khôi phục đối tượng, nó phải được kiểm tra để không phải là không.

- (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; 
} 
Các vấn đề liên quan