2009-10-29 41 views
6

Ban đầu tôi nghĩ rằng điều này sẽ làm việc, nhưng bây giờ tôi hiểu nó sẽ không phải vì artistCollection là một NSMutableArray của "Artist" đối tượng.Lưu/Ghi NSMutableArray của đối tượng vào đĩa?

@interface Artist : NSObject { 
    NSString *firName; 
    NSString *surName; 
} 

Câu hỏi của tôi là cách tốt nhất để ghi vào đĩa của tôi NSMutableArray của đối tượng "Nghệ sĩ" để tôi có thể tải chúng vào lần sau khi chạy ứng dụng của mình là gì?

artistCollection = [[NSMutableArray alloc] init]; 

newArtist = [[Artist alloc] init]; 
[newArtist setFirName:objFirName]; 
[newArtist setSurName:objSurName]; 
[artistCollection addObject:newArtist]; 

NSLog(@"(*) - Save All"); 
[artistCollection writeToFile:@"/Users/Fgx/Desktop/stuff.txt" atomically:YES]; 

EDIT

Rất cám ơn, chỉ có một điều cuối cùng tôi tò mò về. Nếu "Nghệ sĩ" có chứa một biến ví dụ bổ sung của NSMutableArray (softwareOwned) của các đối tượng hơn nữa (Ứng dụng) làm thế nào tôi sẽ mở rộng mã hóa để trang trải điều này? Tôi có thêm NSCoding vào đối tượng "Applications" không, sau đó mã hóa nó trước khi mã hóa "Artist" hoặc có cách nào để xác định điều này trong "Artist" không?

@interface Artist : NSObject { 
    NSString *firName; 
    NSString *surName; 
    NSMutableArray *softwareOwned; 
} 

@interface Application : NSObject { 
    NSString *appName; 
    NSString *appVersion; 
} 

cảm ơn nhiều

gary

+0

Để trả lời chỉnh sửa của bạn: chỉ cần thực hiện NSCoding cho lớp ứng dụng của bạn và, trong EncodeWithCoder của nghệ sĩ: và initWithCoder :, thêm các dòng để xử lý mã hóa/giải mã của mảng có thể thay đổi. Khi được yêu cầu mã hóa chính nó, mảng sau đó sẽ yêu cầu các đối tượng Ứng dụng tự mã hóa. –

+0

Ah tôi thấy, hoàn hảo, cảm ơn Ole. – fuzzygoat

Trả lời

18

writeToFile:atomically: trong Cocoa của các lớp sưu tập chỉ hoạt động cho danh sách thuộc tính, nghĩa là chỉ cho các bộ sưu tập chứa các đối tượng chuẩn như NSString, NSNumber, các bộ sưu tập khác, v.v.

Để xây dựng trên jdelStrother's answer, bạn có thể lưu trữ bộ sưu tập bằng cách sử dụng NSKeyedArchiver nếu tất cả các đối tượng mà bộ sưu tập chứa có thể tự lưu trữ. Để thực hiện điều này cho lớp tùy chỉnh của bạn, làm cho nó phù hợp với các NSCoding giao thức:

@interface Artist : NSObject <NSCoding> { 
    NSString *firName; 
    NSString *surName; 
} 

@end 


@implementation Artist 

static NSString *FirstNameArchiveKey = @"firstName"; 
static NSString *LastNameArchiveKey = @"lastName"; 

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super init]; 
    if (self != nil) { 
     firName = [[decoder decodeObjectForKey:FirstNameArchiveKey] retain]; 
     surName = [[decoder decodeObjectForKey:LastNameArchiveKey] retain]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:firName forKey:FirstNameArchiveKey]; 
    [encoder encodeObject:surName forKey:LastNameArchiveKey]; 
} 

@end 

Với điều này, bạn có thể mã hóa các bộ sưu tập:

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection]; 
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES]; 
9

Hãy xem NSKeyedArchiver. Tóm lại:

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection]; 
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES]; 

Bạn sẽ cần phải thực hiện encodeWithCoder: trên lớp Artist của bạn - xem Apple's docs

hủy lưu trữ (xem NSKeyedUnarchiver) là trái như một bài tập cho người đọc :)

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