2012-11-03 49 views
0

這裏是我的代碼:NSUserDefaults的 - 節能滾動視圖偏移

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
    NSLog(@"scrolled!"); 
    [[NSUserDefaults standardUserDefaults] setFloat:self.mainTableView.contentOffset.y forKey:@"grTableCOy"]; 
} 

正如你可以看到每次用戶滾動,我在設置NSUserDefaults的一些值。只是一個問題 - 這是否有效?

每次我設置一個新值時,NSUserDefaults是否會將內容保存到磁盤,或者只有在調用同步方法時才保存它?

回答

1

這是否高效?

您是否真的高效?或者說「有效」?我想是這樣。讓我們來看看:

NSUserDefaults的是否每次我設置一個新值,或將其保存的時間,只有當同步方法被調用保存的東西到磁盤?

都沒有。它會定期保存其數據,因此不是每次設置它時,也不是隻有當您致電- synchronize時。但是,如果你想成爲100%絕對確保您保存更改後,您可以:

  • 通話- synchronize每次設置一組數據後,或

  • 呼叫- synchronize的方法只有當您的應用程序即將進入後臺或終止時纔會調用它。這樣你的數據將永遠是安全的。

編輯:所以你問的關於真正的效率。那麼,由於NSUserDefaults的行爲如我所述,您不必擔心,它不會每秒執行100次寫入磁盤,並且因爲您聲明在應用程序終止之前調用了synchronize,所以您的數據也是安全的。

+0

我正在調用applicationWillTerminate進行同步。但這對節約能源有好處嗎?我的意思是讓用戶滾動表格。方法didScroll被激發了100次。 NSUserDefaults保存只能說10次,但這仍然寫入磁盤,所以它是節能的?這是我的問題。 – Devfly

+0

@Devfly如果你在'applicationWillTerminate'同步,那很好。每次你滾動一個NSUserDefaults時,都不會保存(只在內存中設置底層的'NSDictionary'),所以你不需要擔心。 – 2012-11-03 14:20:51

1

NSUserDefaults manual有一些關於緩存的信息,這部分應該回答你的問題;

NSUserDefaults緩存信息以避免每次需要默認值時打開用戶的默認數據庫。同步方法會按週期自動調用,使內存中的緩存與用戶的默認數據庫保持同步。

換句話說,您的更改只是有效地存儲在內存,除非你叫synchronize手動將數據不會每次改變的值,而是,但在定期時間持續。

如果您確實希望確定該值已被寫入並存儲,您可以致電synchronize手動完成此操作。當應用即將終止時,這可能是一個好主意。

1

我真的不能說出你在做什麼的表現方面。獲得明確答案的唯一方法是啓動樂器,並使用或不使用NSUserDefaults來衡量scrollview的響應。

問題是否保存?那麼,在這種情況下,訪問文檔應該回答這個問題。以下是同步方法的一個片段:

Writes any modifications to the persistent domains to disk 
and updates all unmodified persistent domains to what is on disk. 

再一次,確保性能問題的唯一方法是在儀器中進行測量。

祝你好運!