簡體   English   中英

iPhone NSUserDefaults持久性難度

[英]iPhone NSUserDefaults persistance difficulty

在我的應用程序中,我有一堆數據存儲在NSUserdefaults 該信息包括一個帶有NSStringsNSNumbersNSObject (Object1),以及另一個對象(Object2)的2個實例。 經過大量搜索和嘗試后,我通過使用NSCodingNSKeydArchiver使其正確保存(和加載)了這些數據。

我的應用程序中的每個屏幕基本上都是該數據模型中的一小部分信息的視圖。 由於可以在其中一些視圖中更改數據,因此需要在屏幕轉換之間保存和加載數據。

我的屏幕視圖鏈是這樣的:根->視圖1->子視圖1

奇怪的是:

在子視圖1中,我從NSUserdefaults加載數據NSUserdefaults並顯示信息(此方法有效),然后用戶可以編輯數據(在本例中為描述公司名稱的NSString )。當用戶按下NSUserdefaults的“后退”按鈕以返回到“視圖1”會觸發保存(這也有效)。

回到“視圖1”,觸發一個viewWillAppear事件。 在此觸發器中,我從“子視圖1”重新加載了保存的數據,並重畫了我的屏幕( UITableViewController )。 由於某些原因,加載后不會反映在前一個屏幕中所做的更改! 加載的對象仍然包含與未發生保存相同的值!

經過一些日志記錄后,即使我在LOAD之前調用了保存,它顯然也會在以后執行。 因此,確認的(通過調試斷點)操作是-> LOAD-> SAVE-> LOAD。 但是根據logfunction(我記錄每個保存和加載調用),它最終顯示為-> LOAD-> LOAD-> SAVE。

誰能幫我這個? -我不知道我在做什么錯。

從我需要的地方創建的對象調用此代碼(及時將其替換為單例),然后通過MyDataStoreObject.currentData訪問保存和加載的數據。

- (void) saveCurrentData {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject: currentData];
    [defaults removeObjectForKey:@"MYAPP_CURRENTDATA"];
    [defaults setObject:data forKey:@"MYAPP_CURRENTDATA"];

    [defaults synchronize];
}

- (void) loadCurrentData {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSData *data = [defaults objectForKey:@"MYAPP_CURRENTDATA"];

    if (data == nil)
    {
        currentData = nil;
        NSLog(@"NO DATA TO RETRIEVE FROM USERDEFAULTS");
    }
    else
    {
        currentData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    }
}

呼叫同步你的NSUserdefaults實例保存后,以確保所有您保存都寫下來,並立即保存的內容。

編輯:

當用戶按下頂部欄中的“后退”按鈕以返回到“視圖1”時,它將觸發保存(這也有效)。

你是怎么做到的? 向我們展示捕獲被觸摸的后退按鈕的代碼,我很好奇它是否每次都執行保存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM