2009-05-04 32 views
7

Tôi có NSMutableArray chứa các đối tượng thuộc kiểu Person (NSString, NSString, int) Tôi đang tìm một cách dễ dàng để lưu mảng này vào đĩa và tải lại sau.Lưu NSMutableArray vào đĩa

Tôi đọc rất nhiều về việc tuần tự hóa nhưng tôi chưa bao giờ làm điều đó. Có lẽ nó không phải là cách dễ nhất cho tôi sau khi tất cả.

Trả lời

10

Bước đầu tiên là làm cho lớp Person của bạn triển khai giao thức NSCoding. Chiến lược cơ bản là triển khai hai phương thức để tuần tự hóa và hủy tuần tự hóa từng biến cá thể của đối tượng mà bạn muốn tồn tại giữa các phiên.

#pragma mark NSCoding Protocol 

- (void)encodeWithCoder:(NSCoder *)encoder; 
{ 
    [encoder encodeObject:[self foo] forKey:@"foo"]; 
    [encoder encodeDouble:[self bar] forKey:@"bar"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder; 
{ 
    if (![super init]) 
     return nil; 

    [self setFoo:[decoder decodeObjectForKey:@"foo"]]; 
    [self setBar:[decoder decodeDoubleForKey:@"bar"]]; 

    return self; 
} 

Để thực sự viết các đối tượng vào đĩa, bạn có thể sử dụng phương pháp writeToFile: NSArray, hoặc sử dụng lớp NSKeyedUnarchiver nếu bạn muốn trở thành rõ ràng hơn về cách nó được thực hiện. Trong cả hai trường hợp, bạn cũng có thể đặt mảng của mình vào một cấu trúc dữ liệu khác (ví dụ: từ điển) nếu bạn muốn bao gồm các mục khác (chẳng hạn như số định dạng tệp) trong tệp dữ liệu của mình.

+0

loại bỏ những người đó; 's –

+1

thực sự tôi đoán đó là không cần thiết, nó chỉ trông lạ hah –

4

Ông Charbonneau có ý tưởng đúng. An NSCoder tóm tắt các serialization cụ thể của đối tượng của bạn, và cho phép bạn lo lắng chỉ về những gì cần phải được serialized/deserialized. Trong -encodeWithCoder:, bạn có thể muốn

NSAssert1([encoder allowsKeyedCoding], 
      @"%@ does not support sequential archiving.", 
      [self className]); 

vì không phải tất cả các bộ lập trình đều hỗ trợ lưu trữ khóa.

Trong -initWithCoder, bạn nên gửi -initWithCoder: - không chỉ đơn giản -init - để super trước khi khởi tạo đối tượng của bạn:

self = [super initWithCoder:decoder]; 
if (!self) return nil; 
// now use the coder to initialize your state 

Ngoài ra, kể từ khi đối tượng của bạn về cơ bản là một danh sách bất động sản đã có, bạn có thể thêm một cái gì đó giống như -[Person plistRepresentation] :

- (NSDictionary *)plistRepresentation 
{ 
    return [NSDictionary dictionaryWithObjectsAndKeys: 
      [self firstName], @"firstName", 
      [self lastName], @"lastName", 
      [NSNumber numberWithInteger:[self age]], @"age", nil]; 
} 

Sau đó, để tuần tự hóa mảng Person s, bạn có thể tự biến đổi người thành plistRepresentation của họ và sau đó sử dụng -[NSArray writeToURL:atomically:]. (Bạn có thể dĩ nhiên cũng sử dụng các phương pháp NSProperyListSerialization trực tiếp.)

1

It wont làm việc ở đây trong mã của tôi bằng cách sử dụng writeToFile: nguyên tử:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *issueURLsPlist = [documentsDirectory stringByAppendingPathComponent:@"test.plist"]; 

MyClass * myObject = [[MyClass alloc] init]; 
NSMutableArray * array = [[NSMutableArray alloc] init]; 
[array addObject:myObject]; 
[array writeToFile:issueURLsPlist atomically:YES]; 

MyClass.h

#import <Foundation/Foundation.h> 


@interface MyClass : NSObject <NSCoding> 
{ 

} 

@property (nonatomic,copy) NSString * foo; 
@property (nonatomic)  double bar; 


@end 

MyClass. m

#import "MyClass.h" 


@implementation MyClass 

- (id)init { 
self = [super init]; 
if (self) { 
    self.foo = @"test"; 
    self.bar = 0.4f; 
} 
return self; 
} 

#pragma mark NSCoding Protocol 

- (void)encodeWithCoder:(NSCoder *)encoder; 
{ 
[encoder encodeObject:[self foo] forKey:@"foo"]; 
[encoder encodeDouble:[self bar] forKey:@"bar"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder; 
{ 
if (![super init]) 
    return nil; 

[self setFoo:[decoder decodeObjectForKey:@"foo"]]; 
[self setBar:[decoder decodeDoubleForKey:@"bar"]]; 

return self; 
} 

@synthesize foo; 
@synthesize bar; 
@end 

Khi tôi đang sử dụng mảng có NSStrings thì phương thức writeToFile: nguyên tử đồng minh: đang hoạt động tốt.

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