0

CoreDataからデータをロードするオブジェクトがあります。次に、ユーザー入力/選択を使用してオブジェクトを変更します。

私の最初は、プロパティのセッターメソッドをオーバーライドすることでした。

-(void)setType:(NSString *)type {
    NSLog(@"setType fired | newType: %@", type);

    _type = type;

    appDelegate *appDelegate = (appDelegate *)[[UIApplication sharedApplication] delegate];

    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:DEFAULTS_DB];

    NSError *error;

    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

    if (fetchedObjects.count == 1) {
        Defaults *defaults = [fetchedObjects objectAtIndex:0];

        defaults.sceneType = type;
    }

    if (![context save:&error]) {
        NSLog(@"Error in saving first run defaults | error: %@", error);
    }
    else {
        NSLog(@"new type was saved to core data");
    }
}

applicationWillResignActive:私の他の考えは、起動時(ただし、アプリがフリーズする前に実行するのに数秒しかかからない)とユーザーがログアウトしたときにコアデータを更新することでした。

私が作成しているアプリは、ユーザーが起動し、必要なものを設定してから、再び使用するまで10〜60分置いておくものです。そのため、非アクティブなときにアプリが強制終了され、データが失われるのではないかと心配しています。

セッターメソッドでコアデータを更新することは、更新を処理するための良い方法ですか、それとも本当に悪い考えですか(リソースを大量に消費し、遅すぎる)?

4

2 に答える 2

0

これは、カスタマーセッターへの呼び出しごとに設定および取得するデータの量によって異なります。私はあなたが今していること(セッターのコアデータを更新する)を試してみますが、古いデバイス、たとえばiPad 1でテストして、どのように動作するかを確認します。しばらく再生した後、すべてのセッターでコアデータを更新するかどうかを決定できます。

さて、パフォーマンスの違いがまったく見られなければ、心配する必要はありません。あなたは上手い。セッターにデータをコミットすることで、ユーザーからの最新のアクションを保存できるという安心感があります。ただし、より多くのデータや大きなファイル/イメージを保存しているときに、以前のデバイスでパフォーマンスの違いが見られるようになる可能性があります。

このような状況に事前に備えるために、コアデータに頻繁に書き込まれるバッファー(エンティティの構造を反映する)をプログラムに含めることをお勧めします-アプリが状態に入るときかもしれません非アクティブの場合、またはアプリがバックグラウンドに移行した場合、または一定期間ごとに発生した場合。セッターでバッファーを更新する必要があります。でコードを書くという考えで起こりうる問題applicationWillResignActive:は、クラッシュを処理する準備ができているかどうかに起因します。クラッシュは、何らかの理由でいつでも発生する可能性がありますが、コードが不適切なためではない場合もあります。そして、これがバッファを持つことが良い考えである1つの強力な理由です。クラッシュ中に小さなデータのチャンクが1つ失われるか(最悪の場合)、パフォーマンスと一貫性が達成されます(最良の場合)。

于 2013-02-14T21:34:13.660 に答える
0

これは一般的な使用パターンではありません。通常は、データを表示して保持する前にオブジェクトをフェッチします。次に、ユーザーが何かを変更したら、オブジェクトのプロパティを更新してコンテキストを保存します。

于 2013-02-14T21:30:19.270 に答える