keep on you
keep on you

Reputation: 310

What are the best practices to cache the data?

What are the best practices to cache the data in iOS apps connected to data source via web service?

Upvotes: 2

Views: 1650

Answers (4)

quellish
quellish

Reputation: 21244

If you're using NSURLConnection, or anything that uses NSURLRequest, caching is already taken care of for you:

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

By default these use the cache policies of the protocol, which for a web service would be the HTTP headers it returns. This is also true, IIRC, of ASIHttpRequest.

Core Data also implements its own row and object caching, which works pretty well. So the reality here is that you really don't need to worry about caching when it comes to these things - it's optimizing your use of things like NSDateFormatter that starts to become important (they're expensive to create, not thread safe, etc...)

And when in doubt, use Instruments to find bottlenecks and latency

Upvotes: 0

barfoon
barfoon

Reputation: 28167

You should lookat NSCache

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

An NSCache object is a collection-like container, or cache, that stores key-value pairs, similar to the NSDictionary class. Developers often incorporate caches to temporarily store objects with transient data that are expensive to create. Reusing these objects can provide performance benefits, because their values do not have to be recalculated. However, the objects are not critical to the application and can be discarded if memory is tight. If discarded, their values will have to be recomputed again when needed.

Upvotes: 4

Mark Granoff
Mark Granoff

Reputation: 16938

It depends on how much data you want to cache and how you'll be accessing it once you have it cached, and a bunch of other cache management issues.

If you have a small amount of data, you could store that in a dictionary or array, and simply write it out and read it in. But this kind of solution can become slow if you have a lot of data; those reads and writes can take a long time. And flushing a dirty cache to disk means writing the whole object.

You could write individual files, but again, if you have a lot of files that might become a performance issue as well.

Another alternative is to use CoreData. If you have a lot of data (say, many objects) it may make sense to define what those look like as CoreData entities. Then you just store and fetch objects as you need them, falling back to fetching from your web service (and then caching) if the data is not local. You can also optimize other cache management tasks (like expiring unused entries) easily and efficiently using CoreData.

I actually went down this road, with a couple different apps. I started with an NSDictionary, and that became quite slow. I switched to CoreData, which not only simplified a lot of my code for cache initialization and management, but gave the apps quite a performance boost in the process.

Upvotes: 0

basvk
basvk

Reputation: 4546

Depends on the type of data

for binary data (files):
- Cache your files in the Cache folder using NSFileManager and NSData writeToFile:

for small ammounts of data (ascii/utf8):
- Use NSUserDefaults

for large ammounts of data (ascii/utf8):
- Use a sqlite3 database

Upvotes: 1

Related Questions