23

ゲームを作成していて、アプリを閉じると (マルチタスク マネージャーで閉じる)、すべてのデータが消えてしまいます! だから、私の質問は非常に簡単です:データを保存するにはどうすればよいですか?

4

6 に答える 6

26

スコアとレベルを保存するとします。これらは両方とも 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(通常、これは解決への迅速で汚い道です)。

于 2013-10-05T12:17:25.810 に答える
0

より一般化されたソリューションにはRealmを使用することをお勧めします。

于 2016-02-02T06:34:17.033 に答える