更新: このスレッドは、コレクション ビューの表現されたオブジェクトが NSManagedObjects である場合の NSCollectionView のバグを特定します。バグは次のようにトリガーされます。
(a) NSArrayController からオブジェクトを削除します。(b) 削除後、NSCollectionView がアニメーションを終了する前に、関連する nsmanagedobjectcontext に対して保存を実行します。
github のこれらのプロジェクトは、この問題を示しています。
https://github.com/artifacts/NSCollectionViewCoreDataBug https://github.com/iracooke/CoreDataCollectionViewCrashing
以下の元の質問
コンテンツ バインディングがコア データ エンティティの NSArrayController の ArrangeObjects にバインドされた NSCollectionView セットアップがあります。コレクション アイテム ビュー (NSCollectionView ビューのプロトタイプ) には、コレクション ビュー アイテムのpresentedObject を介してコア データ エンティティにバインドされたいくつかのコントロールがあります。
ほとんどの場合、これで問題なく動作します。
ArrayController からエンティティを削除しようとすると、objc_exception が発生します。これらのエンティティは、呼び出すだけで削除できます。
[myArrayController removeObject:managedObjectToDelete];
残念ながら、これを行うと、「CoreData は障害を実行できませんでした」というエラーが頻繁に発生します。責任のあるエンティティは、NSArrayController によって管理されているエンティティの 1 つです。
例外がスローされたときにコール スタックを調べると、NSCollectionView が _endOfAnimation メソッドを受け取ったときにクラッシュが発生したことがわかります。これにより、バインドを解除するための他のメソッドが開始されます (ビュー内のコントロールを持つエンティティのプロパティの可能性があります)。
もう 1 つの情報は、私が扱っているエンティティは、モデル内の他のエンティティとは関係がないということです。
次の問題が発生しているように見えます。
- NSArrayController からオブジェクトを削除すると、それらはコンテキストから削除されます。
- コンテキストから削除した後、オブジェクトはフォールトに変わります
- NSCollectionView は、オブジェクトへの参照を保持しています (現在はフォールト)。アニメーションの最後にそれらをクリーンアップしようとします (バインド解除など)。
- NSCollectionView がオブジェクトへのバインドをクリーンアップしようとすると、コア データがオブジェクトで障害を発生させようとします (用語が正しく理解されていることを願っています)。オブジェクトがまだディスクに保存されていないため、エラーが発生します。
これを防ぐために私が考えることができる唯一の方法は、オブジェクトを削除する前に (保存して) ストアに保持することです。これは機能しますが、もう一度保存する前に1ラウンドの削除が完了したことを確認する必要があるため、ハック的な方法でのみ...そしてアニメーション中にエラーが発生するため..少し遅れて..2回連続して保存すると再度同じエラーが発生します。
これは、Core-Data を使用した NSArrayController を使用して NSCollectionView を設定できないということですか? そうでない場合、私は何を間違っていますか?この問題を回避するより良い方法はありますか?