4

アプリケーションでCoreDataを使用していますが、シミュレーターの奇妙な動作を発見しました。アプリのCore Dataにデータを追加し、XCodeの[停止]ボタンを使用してシミュレーターを終了すると(またはCmd-Qを押すだけ)、次にシミュレータを起動したときに、データがデータベースに保存されません。いくつかのテストの結果、データがディスクに保存されていることがわかりました。

  • ホームボタンを押すとすぐに。(ほとんど-非常に高速に終了する場合は、データが保存される前にアプリケーションを終了することができます。)
  • データを追加した後、しばらくの間(少なくとも約20秒)アプリケーションを実行させた場合。

[NSManagedObjectContext save:]を呼び出すことは役に立ちません。動作は同じです。

だから私の質問は:この種の行動の理由は何ですか?終了する前にディスクへのフラッシュを強制する方法はありますか?また、デバイスで実行しているときにこの方法でデータを失う可能性があるリスクはありますか(個人的には、強制終了以外は表示されませんが、奇妙な動作が少し気になります)

4

3 に答える 3

9

Xcodeの停止ボタンでシミュレーターを停止することは、おそらくiPhoneをハンマーで粉砕することと同じです(ただし、SSDは保持されます)。基本的に、アプリと他のすべてはただ停止します。それが起こったときにデータが確実に保存されるようにする合理的な方法はありません。

于 2012-05-03T09:22:22.010 に答える
7

ネストされたコンテキストを使用している可能性があります。コンテキストに親コンテキストがある場合、呼び出し-save:はファイルシステムではなく、そのコンテキストに保存されます。

ネストされたコンテキストは、(通常)バックグラウンドキューのコンテキストを安全に使用するために使用され、ファイルシステムへの保存のオーバーヘッドを発生させることなくフォアグラウンドコンテキストを保存できるようにします。ファイルシステムへの保存はバックグラウンドキューで行われ、メインスレッドをブロックしません。

于 2012-05-05T13:21:20.210 に答える
0

私も非常に長い間これに取り組んできました、そして上記の(2)の下でのダニエル・エガートの答えは私がインターネットで見つけた最初のそして唯一の有用な答えです。JRVはUIManagedDocumentのNSManagedDocumentContextを使用していると思います。この場合、Appleの「デフォルト」の保存方法は不完全です。Daniel Eggertのソリューションを採用したことで、私のデータは完全に保存され、シミュレーターの「STOP」ジェスチャの影響を受けなくなりました。この場合、回復力のあるコードを書きたいと思っている人には、上記(2)のDanielEggertの回答をお勧めします。

于 2018-01-24T11:21:53.357 に答える