2009-12-10 35 views
3

我正在爲每個作業使用自定義作業對象的作業應用程序。我試圖存儲一個NSMutableArray(通過initUserDefaults中的initWithArray :)轉換爲NSArray,但我在保存和重新加載數組時遇到了問題。UserDefaults/KeyedArchiver挫折

我有一個表格視圖,您可以從中選擇添加一個新的任務(加載NewAssignmentViewController)。保存賦值時,它會被推回AssigmentsViewController中的一個數組。然後在每次加載顯示賦值的UITableView時調用它。

下面是有關代碼:

-(void)saveToUserDefaults:(NSArray*)myArray{ 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

if (standardUserDefaults) { 
    [standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"Assignments"]; 
    [standardUserDefaults synchronize]; 
    } 
} 

-(void)retrieveFromUserDefaults{ 
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"Assignments"]; 
if (dataRepresentingSavedArray != nil) { 
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray]; 
    if ([oldSavedArray count] != 0) { 
     [assignments setArray:[[NSMutableArray alloc] initWithArray:oldSavedArray]]; 
    } 
    else { 
     assignments = [[NSMutableArray alloc] initWithCapacity:100]; 
    } 
} 
} 
-(void)backButtonPressed { 
[self saveToUserDefaults:[[NSArray alloc] initWithArray:assignments]]; 
[self.navigationController popViewControllerAnimated:YES]; 
} 

請幫助。它不會加載數組,但不會給出任何錯誤。有關UserDefault或KeyedArchiver的一般提示將不勝感激。

回答

0

我不確定這是否可以解決您的問題,但您不必將數組從默認值作爲NSData提取。檢查NSUserDefaults reference,你會看到數組是有效的默認對象。

2

夫婦的東西在這裏:

如果我理解正確的話,你想儲存一個數組,其內容是分配對象。

如果你想對這些對象的存儲序列化爲NSUserDefaults的,在分配對象本身需要通過重載這些方法,以符合NSCoding協議:

- (void)encodeWithCoder:(NSCoder *)encoder; 
- (id)initWithCoder:(NSCoder *)decoder; 

既然你沒有爲你分配對象張貼代碼,不知道你是否正確或完全做到了這一點。如果你有你應該能夠編碼的對象。有關更多信息,請參見Archives and Serializations Programming Guide

至於NSUserDefaults,通過我的閱讀,你基本上試圖存儲你的應用程序的對象模型。不是最好的主意。 NSUserDefaults最適合用於輕量級持久數據:基本首選項,字符串,通用數據碎片。

我會做的是將您的存檔數據寫出到一個文件中,並在您的視圖加載時加載它。

下面是Beginning iPhone Development關於這個問題的一些代碼:

創建從一個或多個對象符合NSCoding是比較容易的存檔。首先,我們創建NSMutableData的實例來保存編碼的數據,然後創建一個的NSKeyedArchiver實例歸檔對象成NSMutableData實例:

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 

既創造這些之後,我們再使用鍵值編碼存檔我們希望在歸檔中包括任何物體,如:

[archiver encodeObject:myObject forKey:@」keyValueString」]; 

一旦我們編碼中的所有對象,我們想要包括,我們只是告訴Archiver我們完成了,將NSMutableData實例寫入文件系統,然後對我們的對象進行內存清理。

[archiver finishEncoding]; BOOL success = [data writeToFile:@」/path/to/archive」 atomically:YES]; 
[archiver release]; 
[data release]; 

要從存檔重組對象,我們經歷了類似的過程。我們從存檔文件創建一個NSData實例,並創建一個NSKeyedUnarchiver來解碼數據: NSData * data = [[NSData alloc] initWithContentsOfFile:path]; NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

self.object = [unarchiver decodeObjectForKey:@」keyValueString」]; 

你想也需要得到你的application's documents directory保存和載入的文件: 之後,我們使用我們用於存檔對象相同的密鑰從取檔閱讀我們的對象。

這是一本非常有用的書,完整的代碼片斷。關於持久性的章節可能對您有所幫助。使用Core Data來完成這項任務可能會讓你感到更加高興,可以想一想。