Ответ 1
Предположим, вы хотите сохранить оценку и уровень, которые являются одновременно свойствами объекта, называемого dataHolder.
DataHolder может быть создан как одноэлементный, так что вам не нужно слишком беспокоиться о том, откуда вы обращаетесь к нему (его sharedInstance
на самом деле):
Этот код выглядел бы примерно так:
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
Не забудьте указать #import "DataHolder.h", где он вам нужен, или просто поместите его в ...-Prefix.pch
.
Вы можете выполнить фактическую загрузку и сохранение в методах appDelegate
:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[DataHolder sharedInstance] saveData];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[DataHolder sharedInstance] loadData];
}
Вы можете получить доступ к своим данным и данным уровня из любого места с помощью [DataHolder sharedInstance].score
и [DataHolder sharedInstance].level
.
Это может показаться излишним для простой задачи, но это помогает поддерживать порядок вещей, и это может помочь вам избежать хранения всех данных в appDelegate
(что обычно является быстрым и грязным путем к решению).