Je fais un jeu et quand je ferme l'application (fermez le gestionnaire multitâche), toutes mes données sont parties! Donc, ma question est très simple: Comment puis-je sauvegarder les données?
Supposons que vous souhaitiez enregistrer le score et le niveau, qui sont les deux propriétés d'un objet appelé dataHolder.
DataHolder peut être créé en tant que singleton, vous n'avez donc pas à vous soucier de l'endroit d'où vous y accédez (sa sharedInstance
en fait):
Son code ressemblerait un peu à ça:
DataHolder.h
#import <Foundation/Foundation.h>
@interface DataHolder : NSObject
+ (DataHolder *)sharedInstance;
@property (assign) int level;
@property (assign) int score;
-(void) saveData;
-(void) loadData;
@end
DataHolder.m
NSString * const kLevel = @"kLevel";
NSString * const kScore = @"kScore";
@implementation DataHolder
- (id) init
{
self = [super init];
if (self)
{
_level = 0;
_score = 0;
}
return self;
}
+ (DataHolder *)sharedInstance
{
static MDataHolder *_sharedInstance = nil;
static dispatch_once_t onceSecurePredicate;
dispatch_once(&onceSecurePredicate,^
{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
//in this example you are saving data to NSUserDefault's
//you could save it also to a file or to some more complex
//data structure: depends on what you need, really
-(void)saveData
{
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:self.score] forKey:kScore];
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:self.level] forKey:kLevel];
[[NSUserDefaults standardUserDefaults] synchronize];
}
-(void)loadData
{
if ([[NSUserDefaults standardUserDefaults] objectForKey:kScore])
{
self.score = [(NSNumber *)[[NSUserDefaults standardUserDefaults]
objectForKey:kScore] intValue];
self.level = [(NSNumber *)[[NSUserDefaults standardUserDefaults]
objectForKey:kLevel] intValue];
}
else
{
self.level = 0;
self.score = 0;
}
}
@end
N'oubliez pas de #importer "DataHolder.h" où vous en avez besoin, ou simplement le mettre dans ...-Prefix.pch
.
Vous pouvez effectuer le chargement et l’enregistrement dans les méthodes appDelegate
:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[DataHolder sharedInstance] saveData];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[DataHolder sharedInstance] loadData];
}
Vous pouvez accéder à vos données de score et de niveau de n’importe où avec [DataHolder sharedInstance].score
et [DataHolder sharedInstance].level
.
Cela peut sembler excessif pour une tâche simple, mais cela aide certainement à garder les choses en ordre et cela peut vous aider à éviter de garder toutes les données dans appDelegate
(qui est généralement le chemin rapide et sale vers la solution).
[NSUserDefaults standardUserDefaults]
convient aux petites quantités de données, telles que les paramètres utilisateur et les préférences. En règle générale, vous utilisez cette option pour permettre aux utilisateurs de sauvegarder diverses informations définissant des valeurs globales telles que les préférences de personnage, les préférences d’arme, etc.
Pour de plus grandes quantités de données telles que les détails de niveau de jeu, les réalisations ou l'inventaire d'armes, etc. Vous voudrez utiliser quelque chose comme des données de base. Il s'agit d'une base de données plus formelle qui peut être facilement migrée à mesure que votre schéma de données change. Voir la documentation ici: Données de base et Guide de programmation de données de base
Vous pouvez enregistrer des données dans Core Data, Sqlite ou NSUserDefaults Update Realm est également une option très simple à mettre en œuvre.
Il existe peu de moyens de sauvegarder des données dans ios.
Swift 3
Utilisez UserDefaults
UserDefaults.standard.set(„some value”, „key”)
let value = UserDefaults.standard.string(„key”)
Vous pouvez même persister tableau en utilisant cette
Je recommande d'utiliser Realm pour des solutions plus généralisées.