0

这是我的代码:

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

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

NSUserDefaults 是否会在我每次设置新值时将内容保存到磁盘,或者仅在调用同步方法时才保存?

4

3 回答 3

1

这有效率吗?

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

NSUserDefaults 是否会在我每次设置新值时将内容保存到磁盘,或者仅在调用同步方法时才保存?

两者都不。它会定期保存它的数据,所以不是每次你设置它的时候,也不仅仅是当你调用- synchronize. 但是,如果您想 100% 绝对确定您的更改已保存,您可以:

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

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

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

于 2012-11-03T14:17:37.797 回答
1

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

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

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

如果你真的想确保值被写入和存储,你可以调用synchronize手动实现。当应用程序即将终止时,这可能是一个好主意。

于 2012-11-03T14:17:42.550 回答
1

我真的无法谈论你正在做的事情的性能方面。获得明确答案的唯一方法是启动工具,并在使用和不使用 NSUserDefaults 的情况下测量滚动视图的响应。

对于它是否保存的问题?好吧,在这种情况下,访问文档应该可以回答这个问题。这是同步方法的一个片段:

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

同样,确定性能问题的唯一方法是使用仪器进行测量。

祝你好运!

于 2012-11-03T14:20:08.187 回答