1

エンティティ カテゴリに、サブクラス化されたクラスにカスタム メソッドを追加する単純なメソッドがありNSManagedObjectます (サブクラス化が自動的に生成されるため、触れません)。

MOC からオブジェクトを削除し、コンテキストを保存するこのメソッドがあります。

+ (void)deleteWishlist:(Wishlist *)wishlist
    inManagedObjectContext:(NSManagedObjectContext *)context
{

    [context deleteObject:wishlist];

    NSError *error;
    if(![context save:&error]) {
        NSLog(@"%@", error);
    } else {
        NSLog(@"Delete successful");
    }
}

次のように、View Controller の 1 つからこれを呼び出します。

- (void)deleteWishlist:(Wishlist *)wishlist
{
    if(wishlist) {
        [Wishlist deleteWishlist:wishlist inManagedObjectContext:self.managedObjectContext];
    }
}

UI イベント処理メソッド (デリゲートtableView: commitEditingStyle: forRowAtIndexPath:メソッド) から呼び出されます。

これですべて動作しますが、オブジェクトを保存するのに時間がかかります...これがデフォルトの動作かどうかはわかりませんが、グラフから削除した後、すぐに永続ストレージに保存したいと考えています。保存するまで待たなければならないかどうかは気にしません。

iOS シミュレーターで、「停止」を押してアプリを再度ロードすると、ウィッシュリストがまだ残っています。ホームボタンを押すと、アプリはバックグラウンドモードになり、そこで保存されます...しかし、2回保存しているようです。正直なところ、最初は何をしているのかわかりません。

2013-05-29 00:45:14.819 App[29024:c07] [WishlistCDTVC setFetchedResultsController:] set
2013-05-29 00:45:14.820 App[29024:c07] [WishlistCDTVC performFetch] fetching all Wishlist (i.e., no predicate)
2013-05-29 00:45:15.755 App[29024:c07] Delete pressed
2013-05-29 00:45:16.666 App[29024:c07] NSManagedObjects did change.
2013-05-29 00:45:16.669 App[29024:c07] NSManagedContext did save.
2013-05-29 00:45:16.670 App[29024:c07] Delete successful
2013-05-29 00:45:19.119 App[29024:c07] NSManagedContext did save.

私がしたこと:ウィッシュリストVCをロードし、スワイプして削除し、確認すると、「削除が押されました」と表示されました。コンテキストからオブジェクトを削除し、それを保存します (ただし、明らかにここにはありません)。次に、削除が成功したことを示します (したがってエラーはありません)。次に、ホーム ボタンを押すと、最後の「保存」行がログに記録され、最終的に永続ストレージに保存されます。では、なぜ真ん中の人は節約しないのでしょうか?

4

1 に答える 1

0

簡単に修正できます。コンテキストを変更した後は常に保存するNSManagedDocumentようになりました (元に戻す機能は必要ありません)。

共有ドキュメント ハンドラー クラスで、変更通知を保存するように指示します。

- (void)objectsDidChange:(NSNotification *)notification
{
    #ifdef DEBUG
        NSLog(@"NSManagedObjects did change.");
    #endif
    [BSDocumentHandler saveDocument];
}

そしてsaveDocument単なるクラスメソッドです:

+ (void)saveDocument
{
    UIManagedDocument *document = [[BSDocumentHandler sharedDocumentHandler] document];
    [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];
}

すぐに保存されるようになり、停止を使用してシミュレーターを停止すると、保存が保持されるようになりました。

さらに、保存の重複を避けるために、オブジェクトの作成、編集、または削除後に管理対象オブジェクト コンテキストの保存を含むすべての行を削除し、共有ドキュメント ハンドラー クラスがすべての保存を自動的に管理して、コードの重複を大幅に減らしました。

私のログはよりきれいになりました。これは削除を実行しています。すべてのアイテムを一覧表示する VC を呼び出し、スワイプして削除し、確認します。MOC に変更があったことを認識し、(予想どおり) ドキュメントを 1 回保存します。

2013-05-30 13:33:01.310 App[27167:c07] [ItemCDTVC setFetchedResultsController:] set
2013-05-30 13:33:01.312 App[27167:c07] [ItemCDTVC performFetch] fetching all Item (i.e., no predicate)
2013-05-30 13:33:04.735 App[27167:c07] NSManagedObjects did change.
2013-05-30 13:33:04.751 App[27167:c07] NSManagedContext did save.
于 2013-05-30T12:32:23.440 に答える