2009-01-24 34 views
5

Tôi đã gặp phải các kết quả không nhất quán trong khi phát triển ứng dụng iPhone và cố lưu các tùy chọn thông qua cơ chế NSUserDefaults chuẩn. Tôi đang sử dụng mã gần như thẳng ra khỏi Cookbook của nhà phát triển iPhone của Erica Sadun (cuốn sách btw tuyệt vời), có vẻ như sau:hành vi mặc định không phù hợp (NSUserDefaults) trong mặc định mô phỏng iPhone

 
(void) updateDefaults 
{ 
    NSMutableArray *spells = [[NSMutableArray alloc] init]; 
    NSMutableArray *locs = [[NSMutableArray alloc] init]; 

    for (DragView *dv in [boardView subviews]) 
    { 
     [spells addObject:[dv whichSpell]]; 
     [locs addObject:NSStringFromCGRect([dv frame])]; 
    } 

    [[NSUserDefaults standardUserDefaults] setObject:spells forKey:@"spells"]; 
    [[NSUserDefaults standardUserDefaults] setObject:locs forKey:@"locs"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 

    [spells release]; 
    [locs release]; 
} 

Các giá trị được lưu, đôi khi ... và phục hồi, đôi khi. Tôi không thể nhận được một hạt chính xác về những gì hiện hoặc không làm cho nó hoạt động.

Có ai khác có bất kỳ trải nghiệm tương tự nào không? Bất kỳ đề xuất về những gì có thể làm cho nó hoạt động? Là phương pháp đồng bộ hóa cách tốt nhất để buộc ghi đĩa và làm cho các giá trị được lưu, hoặc có cái gì đó tốt hơn (cả cho sản xuất, cũng như mô phỏng).

Cảm ơn Ryan

Trả lời

2

Bạn nên sử dụng một NSKeyedArchiver để lưu mảng của bạn, chẳng hạn như:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:spells] forKey:@"spells"]; 
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:locs] forKey:@"locs"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

Bạn cũng nên chắc chắn lớp học phép thuật của bạn thực hiện các giao thức NSCoding (encodeWithCoder: và initWithCoder:), nếu đó là một lớp tùy chỉnh. Dường như loc của bạn là NSStrings, nó sẽ lưu trữ tốt.

Bạn cũng sẽ cần phải làm một cái gì đó giống như

NSData *dataRepresentingSavedSpells = [currentDefaults objectForKey:@"spells"]; 
if (dataRepresentingSavedSpells != nil) 
{ 
    NSArray *oldSpells = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedSpells]; 
} 

Để tải các giá trị cũ từ giá trị mặc định.

Tôi sử dụng đồng bộ hóa để ghi vào đĩa khi thoát và trải nghiệm này rất đáng tin cậy trong kinh nghiệm của tôi.

+0

Ok, cảm ơn. Tôi hơi bối rối là tại sao tôi cần phải sử dụng một NSKeyedArchiver để lưu trữ một mảng ... sẽ setObject tiêu chuẩn không hoạt động chính xác hoặc đầy đủ vì một lý do nào đó? Tôi đã không chạy trên NSKeyedArchiver trước đây, vì vậy tôi không quen thuộc với nhiều hơn đoạn giới thiệu từ các tài liệu. –

+0

Tôi tin rằng bạn cần sử dụng nó để đảm bảo rằng các lớp tuân thủ NSCoding tùy chỉnh của bạn được lưu trữ đúng cách. Tôi nghĩ rằng setObject chỉ hoạt động với các mảng của các đối tượng được hỗ trợ. Tôi có thể sai mặc dù. –

2

Trên Mac OS X và có thể cũng trên hệ điều hành iPhone, cơ sở dữ liệu mặc định chỉ có thể chứa đối tượng danh sách thuộc tính: NSString, NSNumber, NSArray, NSDictionary và NSData.

Nó không rõ ràng từ đoạn mã của bạn loại chính tả, nhưng nếu nó không phải là một trong những điều trên, nó sẽ không được lưu trữ trong cơ sở dữ liệu mặc định. Các tùy chọn của bạn là:

  1. Viết một phương thức sẽ chuyển đổi đối tượng của bạn sang và từ đại diện chính. Nói cách khác, một phương pháp để tạo một NSDictionary từ đối tượng của bạn và một phương thức khác để khởi tạo đối tượng bằng cách sử dụng một NSDictionary. Bạn cũng có thể chọn lưu trữ nó dưới dạng NSArray hoặc NSString.
  2. Làm cho đối tượng của bạn triển khai giao thức NSCoding và sau đó sử dụng NSKeyedArchiver để chuyển đổi đối tượng thành đối tượng NSData và NSKeyedUnarchiver để chuyển đổi nó trở lại.
+0

yea, tại một số thời điểm tôi nhận ra rằng lớp tùy chỉnh của tôi không được hỗ trợ và đã có phiên bản tùy chọn # 1 của bạn. Tôi có một biểu diễn chuỗi chuẩn của đối tượng Chính tả, mà tôi sử dụng để tự động tạo lại đối tượng khi tải. sau này, tôi sẽ cần phải đi xuống tùy chọn # 2 tuyến đường, nhưng chưa. –

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