Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to save data in iOS

Tags:

I'm making a game and when I close the app (close at multitask manager), all my data is gone! So, My question is very simple: How do I save the data?

like image 273
CenoX Avatar asked Oct 05 '13 11:10

CenoX


People also ask

Does iOS have data saver?

With iOS 13 and later, you can turn on Low Data Mode to restrict background network use and save cellular and Wi-Fi usage. You might want to use Low Data Mode if your cellular or internet plan limits your data usage, or if you're in an area with slow data speeds.

Where is iOS app data stored?

When you set up iCloud for a third-party app, your app data is stored in iCloud instead of locally on your device. Because your data is stored in the cloud, it stays up to date anywhere you've set up iCloud for the app, including your iPhone, iPad, iPod touch, and Mac.


1 Answers

Let's say you want to save score and level, which are both properties of an object called dataHolder.

DataHolder can be created as a singleton, so you don't have to worry too much about from where you access it (its sharedInstance actually):

It's code would look a bit like this:

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 

Don't forget to #import "DataHolder.h" where you need it, or simply put it in ...-Prefix.pch.

You could perform actual loading and saving in appDelegate methods:

- (void)applicationDidEnterBackground:(UIApplication *)application {     [[DataHolder sharedInstance] saveData]; }  - (void)applicationWillEnterForeground:(UIApplication *)application {     [[DataHolder sharedInstance] loadData]; } 

You can access your score and level data from anywhere with [DataHolder sharedInstance].score and [DataHolder sharedInstance].level.

This might seem like an overkill for a simple task but it sure helps to keep things tidy and it can help you to avoid keeping all the data in appDelegate (which is usually the quick & dirty path to solution).

like image 191
Rok Jarc Avatar answered Nov 15 '22 12:11

Rok Jarc