2012-11-03 36 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. 

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

祝你好运!