这是我的代码:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"scrolled!");
[[NSUserDefaults standardUserDefaults] setFloat:self.mainTableView.contentOffset.y forKey:@"grTableCOy"];
}
正如您每次用户滚动时所看到的那样,我在NSUserDefaults中设置了一些值。只是一个问题 - 这是否有效?
NSUserDefaults每次设置新值时都会将内容保存到磁盘上,或者仅在调用synchronize方法时保存它吗?
答案 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.
同样,确保性能问题的唯一方法是在仪器中进行测量。
祝你好运!