21

あなたの経験に基づいて、メイン スレッドのみの NSManagedObjectContext を 1 つだけ使用する iOS アプリの場合、信頼性とパフォーマンスに関して、サーバーからディスクにユーザー設定とキャッシュされたデータを永続化する最良の方法は何ですか?

次のオプションが表示されます。

  • すべての変更の最後にコンテキストを保存する
  • アプリの終了時にのみコンテキストを保存します (Apple のサンプルのように)
  • アプリの終了時にコンテキストを保存する、バックグラウンドに移行する、またはアクティブでなくなる (電話の着信など)
  • タイマーを追加して、変更がある場合にコンテキストを時々保存します
  • コンテキストを保存するための呼び出しを集めて、頻繁に起動しないようにする、特別に準備された遅延保存ルーチンを呼び出します

現在、最初のオプションを使用しているため、信頼性は非常に高く、デバッグ セッション中に Xcode がアプリを終了した後でもデータは保存されますが、アプリがますます複雑になるとパフォーマンスが低下する可能性があります。サーバーからのデータの非同期ロードにより、アプリのフローの任意の時点で DB への変更が発生する可能性がある場合。

一方、アプリの特定のイベント (終了、バックグラウンドへの移行など) で保存すると最高のパフォーマンスが得られますが、経験から、ユーザーがデータを失わないようにするのに十分であると言えますか?

4

4 に答える 4

11

信頼性が高く(アプリがクラッシュしてもデータが失われない)、変更されたが使用されていないオブジェクトによって占有されているメモリを解放できるため、頻繁に保存する必要があると思います。
同時に、保存リクエストで db を圧倒したくありません。
私の提案は、インターフェイス ファイルで 2 つのメソッドを公開し、状況に応じてどちらを呼び出すかを選択することです。

- (void)save {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(save) object:nil];
    [_storage save:nil];
}

- (void)setNeedsSave {
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(save) object:nil];
    [self performSelector:@selector(save) withObject:nil afterDelay:1.0];
}

また、プライベート キューで 2 番目の管理対象オブジェクト コンテキストを使用することを検討しましたか? 親コンテキストとして設定し、バックグラウンドでデータを保存/取得できます: http://www.cocoanetics.com/2012/07/multi-context-coredata/

于 2013-01-20T14:07:53.410 に答える
4

UIApplicationDelegateメソッドapplicationDidEnterBackground:にコンテキストを保存することは、applicationWillTerminate:私にとって常に問題ありませんでした。また、ビッグデータのインポートなどの特別な状況で保存します。

于 2013-01-20T14:00:37.000 に答える
2

以前は変更ごとにコンテキストを保存していましたが、パフォーマンスはそれほど良くありません。現在、フェッチ データ関数の最後にコンテキストを保存しています。パフォーマンスは 4 倍に向上します。バックグラウンド スレッドで関数 async を呼び出す場合は、関数の最初と最後に and がある[context lock]ことを確認してください。[context unlock]

于 2013-08-12T14:15:21.080 に答える