2009-03-15 37 views
10

Tôi có một đối tượng tùy chỉnh chỉ đơn giản là kế thừa từ NSObject. Nó có 3 thành viên - hai phao và NSDate.Đối tượng tùy chỉnh hiện có

Ứng dụng của tôi sẽ có một mảng với một số đối tượng này khởi động xung quanh và tôi cần phải duy trì nó giữa các lần chạy. Làm thế nào tôi có thể thực hiện điều này?

Tôi đã nghĩ về việc sử dụng một db SQLite, nhưng tôi nghĩ rằng đó là một chút overkill kể từ khi truy vấn duy nhất tôi từng làm sẽ là select *.

Trong một thế giới lý tưởng, tôi muốn sử dụng tệp plist xml. Tôi không chắc chắn nếu tôi có thể làm điều này với đối tượng tùy chỉnh của tôi mặc dù. Tôi biết có một tập hợp các đối tượng Danh sách Bất động sản, và rằng NSArray đi kèm theo đó, nhưng writeToFile:atomically: chỉ hoạt động với các đối tượng danh sách thuộc tính.

Bất kỳ suy nghĩ nào sẽ được đánh giá cao, cảm ơn!

Trả lời

21

NSCoding sẽ thực hiện chính xác những gì bạn muốn. Tôi khuyên bạn nên đọc nó trên tài liệu của Apple, nhưng tôi nghĩ nó khá đơn giản để sử dụng. Lớp học của bạn (và bất kỳ lớp học trẻ em nào) sẽ cần triển khai giao thức NSCoding và bạn cần phải thêm các phương thức -encodeWithCoder:-initWithCoder: vào đối tượng của mình. Hầu hết các lớp khung phổ biến đều đã triển khai NSCoding.

Mã cho lớp học của bạn sẽ trông giống như thế này:

-(void) encodeWithCoder: (NSCoder*) coder { 
    [coder encodeInteger: versionValue forKey: versionKey]; 
    [coder encodeObject: myStuff forKey: myStuffKey]; 
} 

-(id) initWithCoder: (NSCoder*) coder { 
    self = [super init]; 
    if (! self) return nil; 
    myStuff = [[coder decodeObjectForKey: myStuffKey] retain]; 
    return self; 
} 

Đó là khuyến cáo bạn thêm một số phiên bản khi mã hóa để cung cấp cho bạn sự linh hoạt để quản lý những thay đổi sang định dạng lưu trữ của bạn trong các phiên bản trong tương lai.

Trong lớp học của tôi, tôi đã thêm một phương pháp tiện lợi để lưu trữ đối tượng của tôi:

-(void) archiveToFile: (NSString*) path { 
    NSMutableData *data = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data]; 
    [archiver encodeObject: self forKey: myArchiveKey]; 
    [archiver finishEncoding]; 
    [archiver release]; 
    [data writeToFile: path atomically: YES]; 
    [data release]; 
} 

và một số khác để bỏ lưu trữ hoặc tạo một đối tượng mới:

+(MyArchive*) newFromFile: (NSString*) path 
      orWithMyStuff: (MyStuff*) myStuff 
{ 
    NSData *data = [[NSData alloc] initWithContentsOfFile: path]; 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data]; 
    MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey]; 
    [unarchiver finishDecoding]; 

    if (myArchive) { 
    [myArchive retain]; 
    } else { 
    myArchive = [[MyArchive alloc] initWithStuff: myStuff; 
    } 
    [unarchiver release]; 
    [data release]; 
    return myArchive; 
} 

Kể từ đối tượng cấp cao nhất của bạn là một NSArray, bạn cần phải sửa đổi hai phương thức cuối cùng cho trường hợp của mình, nhưng hầu hết mã soạn sẵn sẽ giống nhau.

+0

Và điều đó sẽ tạo ra một plist đẹp? Tôi đã có ấn tượng rằng việc viết ra NSData sẽ chỉ tạo ra dữ liệu tuần tự và không phải là một plist. – Jasarien

+0

Điều đó tạo ra một kho lưu trữ NSCoding — một tệp có các bản sao được bảo tồn của các đối tượng của bạn, giống như một tệp nib (nhưng bạn không thể sử dụng Trình tạo giao diện để chỉnh sửa nó). "Hướng dẫn lập trình lưu trữ và sắp xếp cho ca cao" trong tài liệu của bạn sẽ giải thích nó. –

+0

Theo mặc định, nó lưu trữ cho một plist nhị phân, nhưng bạn có thể thay đổi đó thành một plist xml nếu bạn muốn. Thật không may nó không thực sự có thể đọc được vì nó chứa siêu dữ liệu lớp và con trỏ cũng như dữ liệu đối tượng của bạn. –

0

Nếu bạn muốn truy xuất một tập hợp con các đối tượng, SQLite là lựa chọn tốt nhất của bạn.

Nếu không, đó là lựa chọn giữa định dạng plist và NSCoding. plist yêu cầu bạn có thể chuyển đổi các đối tượng tùy chỉnh thành thứ gì đó thân thiện và sau đó chuyển đổi plist trở lại đối tượng của bạn, nhưng NSCoding hơi khó khăn hơn để quấn đầu và không thể dễ dàng chỉnh sửa (hoặc kiểm tra) bằng tay .

+0

Tôi sẽ không sử dụng tập hợp con. Tôi chỉ cần danh sách đầy đủ tồn tại. Làm cách nào để chuyển đổi một đối tượng thành thân thiện với nhau? Đó là sự hiểu biết của tôi rằng có một tập hợp các đối tượng danh sách tài sản và đó là điều đó. Đối tượng của tôi không được làm bằng bất cứ thứ gì không thể chỉnh sửa được ... – Jasarien

Các vấn đề liên quan