2009-08-24 9 views
0

J'ai certaines structures de données dans mon application que je dois conserver à la réception de la notification 'didReceiveMemoryWarning'. Les données sont en quelque sorte un journal actif de toutes les actions que l'utilisateur a effectuées avec l'application (qui est un jeu)Stockage des données de l'application iphone en mémoire insuffisante

Les données que j'ai peuvent ne pas être une petite quantité (possible> quelques centaines de Ko), donc plists don ne semble pas être la bonne solution.

La première des deux possibilités est l'archivage d'objets et la prise en charge de ces objets par le protocole NSCoding. Je ne suis pas sûr que ce soit le bon chemin à choisir.

La deuxième option semble être avec CoreData, en utilisant NSManagedObjectModel et NSPersistentStoreCoordinator. Est-ce un bon moyen de stocker ces objets? Ou est-ce exagéré? (J'utilise l'exemple d'application "Recettes" d'Apple pour référence).

Mes objets sont des types d'objets personnalisés qui contiennent éventuellement NSString, NSNumber, NSInteger et d'autres types simples.

Exemple de quelques-uns des types de données dont je dispose:

// this the base object I need to start with to persist 
@interface MyDataObject : NSObject 
{ 
    MyScore  *aScore; 
    // Contains an object of type 'MyAction' 
    NSMutableArray *allActions; 
} 

@interface MyScore : NSObject 
{ 
    NSInteger currentScore; 
    NSDate  lastUpdated; 
} 

@interface MyAction 
{ 
    NSNumber *actionId; 
    NSString *description 
    MyUser  *associatedUser; 
} 
@interface MyUser 
{ 
    NSNumber *id; 
    NSString *name; 
    NSString *email; 
} 

L'utilisateur peut jouer un tas de jeux différents et pour chaque jeu, j'ai un journal d'activité de ce qui bouge qu'ils ont fait. L'utilisateur peut voir les mouvements effectués jusqu'à présent dans chaque jeu pendant qu'il joue et il peut également basculer entre les jeux inactifs & pour pouvoir également passer en revue les mouvements passés.

+0

Il serait pertinent de publier ce pour quoi vous allez utiliser les données. Comment vous voulez accéder/récupérer les données aura une incidence sur quelle est la meilleure solution. – Jacob

+0

modifié mon message original pour inclure cette information. –

Répondre

1

Un avertissement, ici. Si votre application commence à recevoir ces messages, et que vous utilisez le gestionnaire pour écrire d'énormes quantités de données, le noyau peut ne pas laisser votre application terminer de sauvegarder les choses si la situation est désastreuse (à partir du point de vue du noyau). Quelle que soit l'approche que vous utilisez avec votre journal, vous devriez dégouliner ces données progressivement dans le backing store, afin d'être sûr que vous ne perdrez aucune donnée si cette situation se produit.

+0

Merci. J'ai oublié de mentionner que je prévois de persister périodiquement les données dans l'application. Je ne sais pas quel est le meilleur mécanisme à utiliser. –

0

Je suggérerais plusieurs choses.

  1. Quelle quantité de données est actuellement utilisée pour quelque chose? S'il y a de bonnes chances qu'il ne soit pas utilisé, enregistrez-le.

  2. Combien peut-on recréer/reconstruire?

Jetez un coup d'œil à l'exemple de livre SQLite fourni par Apple.

Je travaille sur une application qui crée des gobs de données en cours de route. La plupart ne sont pas utilisées, mais je n'ai aucune idée des données qui seront utilisées. Ce que je fais est de garder un petit cache des données les plus susceptibles d'être utilisées et le reste va à la base de données SQLite en temps réel. Mes besoins en mémoire restent très faibles, 100K environ. Dans le passé c'était des mégots (et des accidents).

+0

Dans chaque jeu, les données associées au jeu actif ainsi que le journal d'activité sont fréquemment utilisés. Toutes les autres données de jeux seront sauvegardées. Périodiquement, dans le jeu actif, je devrais persister les dernières données générées. –

Questions connexes