2013-10-05 17 views
20

私はゲームを作っています。アプリを閉じると(マルチタスクマネージャで閉じる)、私のすべてのデータはなくなりました!だから、私の質問はとても簡単です:データを保存するには?iOSでデータを保存するには

+8

? –

答えて

25

スコアとレベルを保存するとします。これは、両方ともdataHolderというオブジェクトのプロパティです。あなたは、あなたがそれ(実際にはそのsharedInstance)にアクセスし、そこからについてはあまり心配する必要はありませんので

DataHolderは、シングルトンとして作成することができます。

それはコードが少し次のようになります:

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内のすべてのデータを維持避けるために、あなたを助けることができます。

9

あなたはCoreData、SqlLite内のデータやNSUserDefaults 更新 レルムを保存することができますまた、オプションで、実装が非常に簡単です。

+9

単純なフラットファイル。おそらくJSON形式のデータやCSV形式を含んでいます。 –

+0

どちらが安全ですか? –

+1

あなたは、NSUserDefaultsにそれを保存しないでくださいいくつかの物事を持っている場合。 Realm SQLやコアデータのような他のものに保存し、暗号化を使用してみてください。トークンのユーザー名とパスワードのようなものがいくつかある場合は、キーチェーンを使用してください –

10

[NSUserDefaults standardUserDefaults]は、ユーザーの設定や設定などの少量のデータに適しています。一般的には、これを使用して、キャラクターの好み、武器の好み、その他のようなグローバル値を定義するさまざまなデータを保存することができます。

ゲームレベルの詳細や成果や武器の在庫などの大量のデータ。あなたはコアデータのようなものを使いたいでしょう。これは、データスキーマの変更に伴って容易に移行できる、より正式なデータベースです。 Core DataおよびCore Data Programming Guide

0

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

0

スウィフト3

使用UserDefaults

UserDefaults.standard.set(„some value”, „key”) 
let value = UserDefaults.standard.string(„key”) 

あなたも、IOSのデータを保存するには、いくつかの方法があります。この

1

を使用してアレイを保持することができます。

  1. UserDefaults - 少量のデータを保存する優れた方法です。
  2. ログインデータやパスワードのような安全で分かりやすいデータへのキーチェーンの安全な場所。
  3. Sqliteをデータベース - アプリケーションが構造化データの膨大な量
  4. CoreDataを持っている場合 -
  5. の保存ファイルを保存する必要がありますオブジェクトを記述するオブジェクトグラフに基づいて - もちろん、あなたはまた、直接のすべてのタイプを保存することができますファイルをファイルシステムにコピーします。ただし、セキュリティ上の理由から、アプリケーションコンテナ内のファイルシステムにアクセスすることはできます。
  6. コアデータとSQLiteデータベースに最適な代替方法を使用する
  7. NSKeyedArchiverとNSKeyedUnarchiver - 少量のオブジェクトに最適です。 //私は思うので、

REF - http://www.thomashanning.com/data-persistence-ios/あなたが保存しようとどのくらいされているデータのどのような種類の

関連する問題