2013-08-30 77 views
5

我有一個cartArray(在上面的AppDelegate.h @界面中),當應用程序在後臺模式或應用程序關閉時需要保存。當我添加一個項目(Cart)進入後臺或者通過按減號關閉應用程序時,cartArray什麼也沒有,但應用程序工作正常。我的cartArray包含購物車類。 我可以知道發生了什麼嗎?在線教程非常複雜,我總是發現自己在解釋過程中迷失了方向。IOS:當應用程序關閉或進入背景時保存數組

[AppDelegate.m]

- (void)applicationDidEnterBackground:(UIApplication *)application { 
[AppDelegate saveData]; 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application { 
[AppDelegate getData]; 
} 

+(NSString *) getPathToAchieve{ NSLog(@"+++++getPathToAchieve"); 
    static NSString* docsDir = nil; 
    if (docsDir == nil) { 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     docsDir = [paths objectAtIndex:0]; 
    } 
    NSString *fullFileName = [NSString stringWithFormat:@"%@.plist", docsDir]; 
    return fullFileName; 
} 

- (void)applicationWillTerminate:(NSNotification *)notification{  
    [cartArray writeToFile:[AppDelegate getPathToAchieve] atomically:YES]; 
} 

-(id)initWithCoder:(NSCoder *)aDecoder 
{ self = [super init]; 
    if (self != nil) 
    { 
     cartArray = [aDecoder decodeObjectForKey:@"cartArrayKeys"]; 
    } 
    return self; 
} 

-(void)encodeWithCoder:(NSCoder *)anEncoder 
{ 
    [anEncoder encodeObject:cartArray forKey:@"cartArrayKeys"]; 
} 

+(void)saveData{ 
    [NSKeyedArchiver archiveRootObject:cartArray toFile:[self getPathToAchieve] ]; 
} 

+(id)getData{ 
    return [NSKeyedUnarchiver unarchiveObjectWithFile:[self getPathToAchieve]]; 
} 
+0

你可以添加崩潰日誌到你的問題? – Amar

+0

看起來很糟糕的設計。我建議你在這種情況下使用CoreData。你不必擔心數據是否被保存--CoreData會很好的照顧它。 – deleteme

+0

'CoreData'不需要,只有一個數組。首選'NSDefaults' –

回答

1

你的代碼很雜亂。首先,實現你的Cart-(id)initWithCoder:-(void)encodeWithCoder:,不AppDelegate類(並確保Cart符合NSCoding協議):

- (void) encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:self.title forKey:@"title"]; 
    [encoder encodeObject:self.description forKey:@"description"]; 
    ..... 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    if (self = [super init]) { 
     self.title = [decoder decodeObjectForKey:@"title"] ; 
     self.description = [decoder decodeObjectForKey:@"description"] ; 
     .... 
    } 
    return self; 
} 

其次,實施-(void)saveData-(void)getData

-(void)saveData{ 
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:cartArray] forKey:@"cartArray"]; 
} 

-(void)getData{ 
    NSData *savedArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"cartArray"]; 
    if (savedArray != nil) 
    { 
     NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray]; 
     if (oldArray != nil) { 
      cartArray = [[NSMutableArray alloc] initWithArray:oldArray]; 
     } else { 
      cartArray = [[NSMutableArray alloc] init]; 
     } 
    } 
} 

呼叫saveData當申請將被終止/輸入背景。 加載應用程序時調用getData

+0

我在哪裏放saveData和loadData?在購物車類呢? @Andrey –

+0

我得到udeclared currentDefaults爲「NSData * savedArray = [currentDefaults objectForKey:@」cartArray「];」 –

+1

用[NSUserDefaults standardUserDefaults]取代currentDefualts。將數據保存在applicationWillResignActive中:並將其加載到AppDelegate中的applicationDidBecomeActive:中。 – hacker2007

0

陣列是一種臨時存儲,如果你想保存在永久的一些數據,然後嘗試使用NSUSerDefult。關閉應用程序陣列後可能會消失。 NSUSerDefult數據不會消失。只有當應用程序從模擬器中刪除或刪除應用程序時,NSUserDefault纔會消失。

1

做你的儲蓄在

- (void)applicationWillResignActive:(UIApplication *)application 

從文檔:

告訴該應用程序將變爲無效委託。 調用此方法讓您的應用程序知道它即將從活動狀態移動到非活動狀態。這可能發生在某些 類型的臨時中斷(例如來電或 SMS消息)或當用戶退出應用程序並且它開始 轉換到後臺狀態。處於非活動狀態 狀態的應用程序將繼續運行,但不會將傳入事件分派給 響應方。您應該使用此方法來暫停正在進行的任務,禁用定時器,並降低OpenGL ES幀速率。遊戲應該使用這個 方法來暫停遊戲。處於非活動狀態的應用程序應該在等待轉換到活動狀態或 背景狀態時執行最少的工作。

相關問題