4

一時的なNSManagedObjectを作成し、それをメインのNSManagedObjectContextに関連付けます。コンテキスト内で完全に機能するオブジェクト(フェッチ要求の実行など)として処理できる必要があるため、コンテキストが関連付けられていないと作成できません。新しいViewControllerがスタックにプッシュされただけではないという条件の下で、ViewWillDisappearに管理対象オブジェクトを削除するロジックを含めます。

- (void)viewWillDisappear:(BOOL)animated { 
  [super viewWillDisappear:animated];

  NSArray *viewControllers = self.navigationController.viewControllers;
  if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) {
    // View is disappearing because a new view controller was pushed onto the stack
  } else  {
    // View is disappearing for some other reason
    [self.community.managedObjectContext deleteObject:self.community];
  }
}

これにより、アプリケーションの終了を除くすべての場合で、管理対象オブジェクトが適切に削除されるようです。viewDidUnloadでオブジェクトを削除しようとしましたが、アプリケーションの終了時にメソッドが呼び出されていないようです。2番目の管理対象オブジェクトコンテキストを作成することを検討しましたが、可能であれば大きなオーバーヘッドを避けたいと思います。

ありがとう、グラハム

4

4 に答える 4

1

マネージド オブジェクトをクラス変数として共有インスタンスに保持し、それを処理するクラスよりもアプリケーション内のより多くの場所からアクセスできるようにします。

次の 2 つのシナリオがあります。

1) iOS 4.0 より前
applicationWillTerminate の場合、コンテキストからオブジェクトを削除できます。

2) iOS 4.0 以降。
アプリケーションがバックグラウンドになり、プロセスを強制終了する場合 (「kill app bar」を使用して難しい方法で)、applicationWillTerminate が呼び出されることはありません。このイベントを認識できません。したがって、あなたはapplicationWillTerminateにうんざりしています。
次のように解決する必要があります:
- applicationWillEnterBackground: -> userdefaults または単純なファイルの管理対象オブジェクトに識別子を保存します。
- applicationDidFinishLaunching: -> ファイルが存在する場合は、参照している管理オブジェクトを削除します。
- applcationWillEnterForeground: -> ファイルを削除します。

これで、アプリがバックグラウンドに入って戻ってきたときに、同じ状態になり、オブジェクトは削除されません。アプリを強制終了すると、オブジェクトは起動時に削除されます。

于 2011-02-26T21:18:42.233 に答える
0

すでに実用的な答えがあることは理解していますが、オブジェクトが本当に一時的であり、保存されない場合は、子コンテキストで作成してみませんか?必要なすべてのフェッチの可視性は維持されますが、コンテキストでsaveを呼び出すまで、他のコンテキストにプッシュされたり、物理データベースに保存されたりすることはありません。

saveを呼び出さない場合、一時オブジェクトは保存されないため、実際には一時オブジェクトになります。

そしてキッカー...実際のデータベースに入れられることはないので、余分なコードを記述したり、すべての「終了」条件を処理したりする必要はありません。

于 2012-04-19T20:43:33.317 に答える
0

アプリ デリゲートで、-applicationWillTerminate: メソッドを実装します。このメソッドは、アプリケーションがメモリから消去される直前に呼び出され、そこで一時管理対象オブジェクトを削除できます。

于 2011-02-26T21:10:17.570 に答える
0

applicationWillTerminateおよびそのマルチタスクのいとこは機能しますが、単一のオブジェクトのみを削除するため、削除するたびにコンテキストを保存するのが最善の方法です。

呼び出すだけ- (BOOL)save:(NSError **)errorです:

[self.community.managedObjectContext deleteObject:self.community];
NSError *error = nil;
[self.community.managedObjectContext save:&error];
于 2011-02-26T21:51:35.343 に答える