2010-09-18 196 views
3

假設我的應用程序狀態被解壓縮到一個對象中(以便所有特定於應用程序實例的信息都包含在一個對象中)並且該對象支持nscoding協議。我如何輕鬆地堅持它並將其加載到退出/啓動我的應用程序?如何在退出時輕鬆保持應用程序狀態

我當前的代碼看起來像這樣

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    State* state = (State*)[defaults objectForKey:@"State"]; 
    if(state!=nil) 
    { 
    viewController.state = state; 
    } 
} 

- (void)applicationWillTerminate:(UIApplication *)application { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:self.viewController.state forKey:@"State"]; 
} 

但在加載狀態始終爲零,所以,我認爲它是不是最好的模式在那裏:)


原來NSUserDefaults只支持屬性列表對象,如NSArray,NSData等...沒有自定義對象,除非你把它包裝在nsdata中

回答

5

在應用程序退出之前存儲應用程序狀態的方法有很多種,當它再次啓動時會將其恢復。最好的方法真的取決於你的應用程序。

如果你有一個簡單的對象模型,只有一個根對象,並且你傾向於一次需要在內存中的整個對象模型,那麼你可能會發現NSCoding協議(見下面的鏈接)保存狀態的好方法。

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html

任何你想堅持要實現此協議的兩種方法的對象:

- (void)encodeWithCoder:(NSCoder *)aCoder // to serialise the object 
- (id)initWithCoder:(NSCoder *)aCoder // to restore an object 

一旦你在任何你想堅持的對象實現了這些方法,你可以用這樣的東西來連續化你的對象圖:

- (void)applicationWillTerminate:(UIApplication *)application { 
    [NSKeyedArchiver archiveRootObject:yourRootObject toFile:someFilePath]; 
} 

當你想恢復存檔的對象:

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    id yourRootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:someFilePath]; 
} 

或者,如果您的應用程序的對象模型稍微複雜一些,則可以考慮使用Core Data。

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html

最後,而用戶默認系統可以用於存儲和檢索的值,它最好用於簡單的應用程序的設置(或首選項)。它並非真正用於保存整個應用程序的狀態。

0

什麼類型的對象是狀態?

我相信NSUserDefaults只保存NSDataNSStringNSDictionaryNSDateNSArrayNSNumber

在過去,我已經將狀態保存爲字典並使用NSUserDefaults進行存儲。您也可以將您的狀態歸檔並將其轉換爲NSData並將其保存爲NSUserDefaults

相關問題