2009-08-21 6 views
0

私は、iPhoneベースのデータを永続化する方法が私のiPhoneアプリで正しい方法であるかどうかを判断しようとしています。iphone data persistence健全性チェック

私はまだCore Dataの複雑さを熟知していないので、FMDBラッパーでSqliteを使用しています。

私はtheElementsサンプルに似たシングルトンを使用するクラスを持っています。ここでは

は、私は今それをやっている方法です。静的共有インスタンスが作成され、2つ以上のビューで共有されます。データがダウンロードされ、このクラスの配列にロードされます。私はSqliteにダウンロードを保存します。私は初期化時にSqliteのデータをロードし、タイムスタンプごとにWebから更新を取得します。

私はこれを「正しい」方法ですか?これは適切に見えますか?

ここでは、簡潔にするために重度にカットされた擬似コードを示します。

@implementation theClass 
static theClass *sharedInstance = nil; 
... 
- (void)requestDone:(Request *)request 
{ 
    NSDictionary *results=[[request responseString] JSONValue]; 
    [self._array removeAllObjects]; 
    [self._array addObjectsFromArray:results]; 
    [self updateDatabase]; //stores any new results 
    [[NSUserDefaults standardUserDefaults] setObject:self.lastUpdated forKey:@"LastAccessed"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [self didFinish]; 
} 
-(void)setupArray { 
    self._array=[NSMutableArray array]; 
    ... 
} 
... 
-(void)getUpdates { 
    NSURL *jsonURL = [NSURL URLWithString:@"URL TO THE WEBDATA"]; 
    request = NSURLRequst.... 
} 
- init { 
    if (self = [super init]) { 
     [self setupArray]; 
    } 
    return self; 
} 

+ (theClass *)shared { 
    @synchronized(self) { 
     if (sharedInstance == nil) { 
      [[self alloc] init]; // assignment not done here 
     } 
    } 
    return sharedInstance; 
} 

+ (id)allocWithZone:(NSZone *)zone { 
    @synchronized(self) { 
     if (sharedInstance == nil) { 
      sharedInstance = [super allocWithZone:zone]; 
      return sharedInstance; // assignment and return on first allocation 
     } 
    } 
    return nil; //on subsequent allocation attempts return nil 
} 

- (id)copyWithZone:(NSZone *)zone { 
    return self; 
} 

- (id)retain { 
    return self; 
} 

- (unsigned)retainCount { 
    return UINT_MAX;} 

- (void)release { 
    //do nothing 
} 

- (id)autorelease { 
    return self; 
} 
+0

http://cocoawithlove.googlepages.com/SynthesizeSingleton.h.zipこのマクロを使用すると、クラスを自分でコーディングする代わりにシングルトンにすることができます。 +(ClassName *)sharedClassNameを追加するだけです。 (ClassNameを置き換えてください)、そしてインプリメンテーションではsynthesizesingleton.hファイルをインポートし、SYNTHESIZE_SINGLETON_FOR_CLASS(ClassName);を実行します。これを行う利点は、シングルトンクラスが複数ある場合は、コードが重複しないことです。 – mk12

+0

素晴らしいチップ。ありがとう! 上記はデータと永続ストレージに適した方法だと思いますか? –

答えて

0

私は同じ問題を見ていると私はNSUserDefaultsの設定や、おそらく状態ではなく、状態データのような小さなデータセット、すなわち、のためであると結論付けました。私が見ている大きなデータ値やデータは[NSArray writeToFile]でファイルに保存し、[NSArray initFromFile]で読み返します。

アプリケーションに割り当てられたパスをクエリし、ファイル名を追加する必要があります。私がまだ学んでいないのは、ファイルの存在を確認する方法、削除する方法(またはその他のクリア/リセット手段)です。

私は今夜実験します。私がやりたいことのもう一つはXMLファイルを永続させることですが、私が望むことができるのは、ファイル内のXML文字列だけです。こうすることで、ネットワーク上のデータを取得し、同様のデータのローカルコピーをロードするために同じロジックを共有できます。

ところで、シングルトンの目的は何ですか?あなたはすでにすべてのスレッドを所有しており、他のプロセス(アプリケーション)がサンドボックスにアクセスすることはできないので、セマフォ(mutex)を使用できるはずです。私の質問は挑戦ではなく、iPhoneでどんなパターンが役立つかを理解するのを助けることです。

0

実際には、NSUserDefaults plistを使用して、最後に更新された時間だけをスナップします(必要に応じて)。私はすべてをsqlite DB([self updateDatabase])に保存します。

NSString *fullPath = [[[NSBundle mainBundle]bundlePath] stringByAppendingPathComponent:@"filenamehere"]; 
//--or-- 
NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:filenamehere]; 

if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath]) ... 

を削除するには:ファイルの存在を確認するために

[fileManager removeItemAtPath:pathtofile error:NULL]; 

私はあなたの質問は、私が持っていた1(やや)であると思います。私は、データがアプリケーションの複数のviewcontrollersにアクセスされたときに、シングルトンクラスが永続的なデータストレージへのアクセスを処理する必要があるかどうか疑問に思っていました。私はちょうど私のアプリのためにうまくいくので、デザインにこだわりました(非常に大きなアプリでは私が推測するメモリの問題を見ることができます)。だから私は自分の質問に答えたと思う。

関連する問題