NSUserDefaults - 保存scrollView偏移量

时间:2012-11-03 14:08:49

标签: iphone ios xcode cocoa-touch nsuserdefaults

这是我的代码:

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

正如您每次用户滚动时所看到的那样,我在NSUserDefaults中设置了一些值。只是一个问题 - 这是否有效?

NSUserDefaults每次设置新值时都会将内容保存到磁盘上,或者仅在调用synchronize方法时保存它吗?

3 个答案:

答案 0 :(得分:1)

  

效率这么高吗?

你真的意味着高效吗?或者说“有效”?我认同。我们来看看:

  

NSUserDefaults每次设置新值时都会将内容保存到磁盘上,或者仅在调用synchronize方法时保存它吗?

都不是。它会定期保存数据,因此不是每次都设置数据,而不是仅在您调用- synchronize时。但是,如果您想100%绝对确定您的更改已保存,您可以:

  • 每次设置一组数据后调用- synchronize,或

  • 仅在方法中调用- synchronize,当您的应用程序即将进入后台或终止时,会调用该方法。这样,您的数据将始终是安全的。

编辑:所以你问的是真实效率。好吧,既然NSUserDefaults的行为与我所描述的一样,你不必担心,它不会每秒执行100次写入磁盘,并且因为你声明在应用程序终止之前你正在调用synchronize ,您的数据也是安全的。

答案 1 :(得分:1)

NSUserDefaults manual有一些关于缓存的信息,这部分应该回答你的问题;

  

NSUserDefaults缓存信息,以避免每次需要默认值时都必须打开用户的默认数据库。 synchronize方法会定期自动调用,使内存缓存与用户的默认数据库保持同步。

换句话说,您的更改只是有效地存储在内存中,除非您手动调用synchronize,否则每次更改值时数据都不会保留,而是定期更新间隔。

如果您确实希望确保编写并存储该值,则可以调用synchronize来手动执行此操作。当应用程序即将终止时,这可能是一个好主意。

答案 2 :(得分:1)

我真的无法谈论你正在做的表现方面。获得明确答案的唯一方法是启动仪器,并使用和不使用NSUserDefaults来测量scrollview的响应。

关于它的保存问题?那么,在这种情况下,文档之旅应该回答这个问题。以下是同步方法的片段:

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

同样,确保性能问题的唯一方法是在仪器中进行测量。

祝你好运!