Enregistrer NSCache Contenu sur le Disque
Je suis en train d'écrire une application qui a besoin de garder en mémoire cache d'un ensemble d'objets, mais cela ne veut pas sortir de la main, donc je suis à la planification sur l'utilisation de NSCache pour stocker l'ensemble. Dirait qu'il va prendre soin de purge et pour moi, ce qui est fantastique.
Je tiens également à rendre le cache entre les lancements, donc j'ai besoin d'écrire les données en cache sur le disque. Est-il un moyen facile de sauvegarder le NSCache contenu d'un fichier plist ou quelque chose? Y sont peut-être de meilleures façons d'accomplir cela en utilisant quelque chose d'autre que NSCache?
Cette application sera sur l'iPhone, donc je vais avoir besoin seules les classes qui sont disponibles dans iOS 4+ et pas seulement les OS X.
Merci!
OriginalL'auteur Cory Imdieke | 2010-12-27
Vous devez vous connecter pour publier un commentaire.
Vous avez pratiquement décrit exactement ce qu'il CoreData n'; la persistance des objets graphiques à l'aide de la purge et de capacités de nettoyage.
NSCache
n'est pas conçu pour aider avec une bonne persistance.Étant donné que vous l'avez suggéré, la persistance d'une plist format, en utilisant la Base de Données au lieu de cela n'est pas que les grandes d'une différence de conception.
Yah-je peux voir votre énigme. NSCoding n'est pas que difficile à mettre en œuvre -- vous pouvez toujours aller dans cette voie. La question devient alors le moment d'écrire/de mise à jour de la persistance de la version de la mémoire cache. Dans mon expérience, il est assez facile de la tête sur un chemin qui se termine en ré-inventant la persistance de la roue avec toutes ses complexités. Et, bien sûr, la meilleure exécution de l'application est l'un des navires de la première. 😉
nous sommes face à la même situation maintenant et je suis à la planification de l'utilisation de NSCache. Je me demandais quelle solution avez-vous choisi?
Ce fut un moment de retour, mais je crois que nous avons essentiellement utilisé un NSDictionary et a écrit tout un Plist, et vient d'écrire notre propre cache la purge des routines pour nettoyer le dictionnaire si nécessaire. Essentiellement, nous avons construit notre propre NSCache de style de l'objet, mais a ajouté persistance.
meilleure réponse maintenant est d'utiliser soit CoreData ou du Domaine. Coredata est plus standard, Domaine plus facile à apprendre.
OriginalL'auteur bbum
utilisation TMCache (https://github.com/tumblr/TMCache). C'est comme NSCache mais avec de la persévérance et de la purge du cache. Écrit par le Tumblr de l'équipe.
meilleure réponse maintenant est d'utiliser soit CoreData ou du Domaine. Coredata est plus standard, Domaine plus facile à apprendre.
OriginalL'auteur Philip Fung
Parfois, il peut être plus pratique de ne pas traiter avec les Données de Base et juste pour enregistrer le contenu du cache sur le disque. Vous pouvez réaliser cela avec
NSKeyedArchiver
etUserDefaults
(je suis en utilisant Swift 3.0.2 dans les exemples de code ci-dessous).Laissez-moi d'abord abstraite de
NSCache
et imaginons que nous voulons être en mesure de prolonger le cache qui est conforme au protocole:Key
de type associé doit êtreHashable
parce que c'est la condition pourSet
paramètre de type.Ensuite, nous avons à mettre en œuvre
NSCoding
pourCache
à l'aide de la classe helperCacheCoding
:Ici:
C
est le type qui est conforme àCache
.C.Key
de type associé doit être conforme à:CustomStringConvertible
protocole de conversion àString
parce queNSCoder.encode(forKey:)
méthode accepteString
pour le paramètre clé.ExpressibleByStringLiteral
protocole de convertir[String]
retour àSet<Key>
Set<Key>
à[String]
et de les stocker dansNSCoder
aveckeys
clé, car il n'existe aucun moyen pour extraire durant le décodage deNSCoder
clés qui ont été utilisés lors de l'encodage des objets. Mais il y a peut être de la situation quand nous avons également entrée dans le cache avec les principauxkeys
donc de distinguer les clés de cache de spécialkeys
clé que nous préfixe cache avec les touches de_
.C.Value
de type associé doit être conforme auxNSCodingConvertible
protocole pour obtenirNSCoding
les instances à partir de valeurs stockées dans la mémoire cache:Value.Coding
doit être conforme auxValueProvider
protocole parce que vous avez besoin pour obtenir des valeurs de retour deNSCoding
instances:C.Value.Coding.Value
etC.Value
être équivalent, car la valeur à partir de laquelle nous obtenonsNSCoding
exemple lors de l'encodage doit être du même type que la valeur que nous revenons deNSCoding
lors du décodage.CB
est un type qui est conforme àBuilder
protocole et qui contribue à créer instance de cache deC
type:Prochaine, nous allons faire des
NSCache
conforme àCache
protocole. Ici, nous avons un problème.NSCache
a le même problème queNSCoder
t - il ne fournit pas de moyen d'extraire les clés pour les objets stockés. Il existe trois façons de contourner ce problème:Envelopper
NSCache
personnalisé pour le type qui détiennent les clés deSet
et de l'utiliser partout, au lieu deNSCache
:Si vous avez encore besoin de passer
NSCache
quelque part, alors vous pouvez essayer de l'étendre en Objective-C faire la même chose, comme je l'ai fait ci-dessus avecBetterCache
.Utiliser un autre cache de mise en œuvre.
Maintenant vous avez un type qui est conforme à
Cache
protocole et vous êtes prêt à l'utiliser.Nous allons définir le type
Book
les instances qui nous permettra de stocker dans le cache etNSCoding
pour ce type:Certains typealiases pour une meilleure lisibilité:
Et le constructeur qui va nous aider à instancier
Cache
exemple:Tester:
OriginalL'auteur mixel
Vous devriez essayer AwesomeCache. Ses principales caractéristiques:
Exemple:
OriginalL'auteur mixel