Like Adam Ko, I would suggest using Core Data:
In the end, this problem is what it is really good at!
If your cache elements are independent of each other, this can be achieved simply by transferring your cache elements with a thin layer of NSManagedObject (i.e. you can benefit from Core Data with minor changes to your application).
This wrapper object can store an archived version of a cache element in an attribute of type NSBinaryDataAttributeType and provide access to an unarchived object through a transient property. See Custom Permanent Attributes for an example.
source share