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

问题描述 投票:2回答:4

在通过Web服务连接到数据源的iOS应用中缓存数据的最佳实践是什么?

iphone cocoa-touch ipad
4个回答
4
投票

您应该查看NSCache

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

NSCache对象是类似于集合的容器或缓存,用于存储键值对,类似于NSDictionary类。 开发人员通常会合并缓存以临时存储具有创建成本高昂的瞬态数据的对象。 重用这些对象可以提供性能优势,因为不必重新计算它们的值。 但是,对象对应用程序并不重要,如果内存紧张,可以将其丢弃。 如果丢弃,则需要时必须重新计算它们的值。


1
投票

取决于数据类型

对于二进制数据(文件)
-使用NSFileManagerNSData writeToFile:将文件缓存在Cache文件夹中NSData writeToFile:

用于少量数据(ascii / utf8)
-使用NSUserDefaults

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


0
投票

这取决于要缓存的数据量以及缓存后如何访问它们,以及一系列其他缓存管理问题。

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

您可以编写单个文件,但是如果有很多文件也可能会导致性能问题,则可以再次编写。

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

我实际上是走了这条路,有几个不同的应用程序。 我从NSDictionary开始,然后变得很慢。 我改用CoreData,这不仅简化了很多用于缓存初始化和管理的代码,而且在此过程中使应用程序获得了相当大的性能提升。


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标头。 IIRC的ASIHttpRequest也是如此。

Core Data还实现了自己的行和对象缓存,效果很好。 因此,这里的现实是您真的不需要担心缓存这些事情-它正在优化您对NSDateFormatter之类的东西的使用,这种东西开始变得很重要(它们创建起来很昂贵,而不是线程安全的,等等。 ..)

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

© www.soinside.com 2019 - 2024. All rights reserved.