0

NSInMemoryStoreTypeストアに基づく Core Data スタックがあります。そして、オブジェクトを削除しても、実際にはそれらが削除されたり nil になったりするのではなく、単純に障害になることに気付きました。

たとえば、(MyManagedObjectEntityClass と <> 識別子はプレースホルダーです) :

    MyManagedObjectEntityClass *o = [NSEntityDescription insertNewObjectForEntityForName:@"<MyManagedObjectEntityClass Entity Name>" inManagedObjectContext:self.localContext];
    NSLog(@"\n%@", o);
    [self.localContext deleteObject:o];
    NSLog(@"\n%@", o);

オブジェクトがまだそこにあることをログに記録するのは、そのデータが障害であるということだけです。

また、削除後に追加 [self.localContext save:nil];しても、これは変わりません。

ある時点で のo変数をテストできることを望んnilでいました。その場合、オブジェクトをリロードしますが、できないようです。

念のため、はい、代わりにテストできることはわかってo-isFaultます。しかし、このテストを NSSet に外挿すると[[set anyObject] isFault]、そのセット内のすべてのオブジェクトが削除されたと結論付けることはできません (理想的には、セットのカウントは 0 ですが、すべてのオブジェクトはまだ障害として残っています)。

したがって、オブジェクトが管理対象オブジェクトであるという事実に対して透過的な方法でオブジェクトが削除されたことをテストできるようにするために、それがまったく可能かどうか、またはどのような代替アプローチを取ることができるか疑問に思っています。

4

1 に答える 1

1

これは実際には Core Data の問題ではありません。C (およびその拡張により Objective-C) は、そのようには機能しません。

このdeleteObject:メソッドは、1 つの引数 (オブジェクトへのポインター) を取ります。オブジェクトを変更したり (isDeletedフラグを設定するなど)、オブジェクトに関連する他のことを実行したり (管理対象オブジェクト コンテキストからオブジェクトを削除するなど) することができます。ポインター自体の値を変更することはできません。したがって、何をするか、何をすべきか、C は、それが完了すると、渡されたポインターは引き続きメモリ内の同じ場所を指していると言います。結果として、そのメソッドがこの言語でそのポインターを強制的に nil にすることは実際には不可能です。nil にしたい場合は、自分で変更する必要があります。(余談ですが、ポインタ引数へのポインタを取るメソッドを実装することは可能でした。ポインターを変更します。ただし、これは配列内の参照などの他の参照には影響しないため、意味がありません)。

メソッドが公開されているのはこのisDeletedためです。このオブジェクトへのポインターが別の場所にある場合は、使用する前に削除されているかどうかを確認できます。

それが十分に便利でない場合 (多くの場合そうではありません)、Core Data は および も提供NSManagedObjectContextObjectsDidChangeNotificationNSManagedObjectContextDidSaveNotificationます。これらをアプリ内の任意の場所で使用して、コンテキストへの変更の通知を受け取り、適切な方法 (配列の更新など) で応答することができます。これらの通知はどちらも、挿入、更新、および削除されたオブジェクトのリストを提供することで、あなたを助けようとします。参照を実際に更新する必要があるかどうかを確認するために、可能な場合はそれらを使用してください。

于 2013-05-09T16:35:06.410 に答える