缓存数据的最佳做法是什么?

时间:2012-01-26 19:00:13

标签: iphone cocoa-touch ipad

通过网络服务缓存连接到数据源的iOS应用中的数据的最佳做法是什么?

4 个答案:

答案 0 :(得分:4)

你应该看NSCache

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSCache_Class/Reference/Reference.html

  

NSCache对象是类似于集合的容器或缓存   存储键值对,类似于NSDictionary类。开发商   通常包含缓存来临时存储具有瞬态的对象   创建成本高昂的数据。重用这些对象可以提供   性能优势,因为他们的价值观不一定如此   重新计算。但是,对象对应用程序并不重要   如果记忆力很紧,可以丢弃。如果丢弃,他们的价值观   必要时必须重新计算。

答案 1 :(得分:1)

取决于数据类型

表示二进制数据(文件)
- 使用NSFileManagerNSData writeToFile:和/ {来缓存您在Cache文件夹中的文件 用于小型数据(ascii / utf8)
- 使用NSUserDefaults

用于大量数据(ascii / utf8)
- 使用sqlite3数据库

答案 2 :(得分:0)

这取决于您要缓存的数据量以及缓存后的访问方式,以及其他一些缓存管理问题。

如果您有少量数据,可以将其存储在字典或数组中,然后将其写出来并将其读入。但如果您拥有大量数据,这种解决方案可能会变慢;那些读写可能需要很长时间。将脏缓存刷新到磁盘意味着编写整个对象。

您可以编写单个文件,但如果您有许多文件也可能会成为性能问题。

另一种选择是使用CoreData。如果您有大量数据(例如,许多对象),那么定义CoreData实体的外观可能是有意义的。然后,您只需根据需要存储和获取对象,如果数据不是本地数据,则回退到从Web服务获取(然后缓存)。您还可以使用CoreData轻松高效地优化其他缓存管理任务(如使未使用的条目到期)。

我实际上走了这条路,有几个不同的应用程序。我开始使用NSDictionary,这变得非常慢。我切换到CoreData,它不仅简化了我的许多代码进行缓存初始化和管理,而且还为应用程序提供了相当大的性能提升。

答案 3 :(得分:0)

如果您正在使用NSURLConnection或任何使用NSURLRequest的内容,则已经为您处理了缓存:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-169425

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Concepts/CachePolicies.html#//apple_ref/doc/uid/20001843-BAJEAIEE

默认情况下,这些使用协议的缓存策略,对于Web服务,它将是它返回的HTTP头。 ASIHttpRequest也是如此,IIRC。

Core Data还实现了自己的行和对象缓存,效果非常好。所以这里的实际情况是,当涉及到这些事情时你真的不需要担心缓存 - 它正在优化你对NSDateFormatter开始变得重要的东西的使用(它们创建起来很昂贵,而不是线程安全等等)。 ..)

如有疑问,请使用Instruments查找瓶颈和延迟