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?
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.
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.
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With