多くの人が知っているかもしれませんが、アウトラインビューにバインドされたNSTreeControllerは、コアデータエンティティを表示しているときに重複を表示できます。
一時的な解決策は、述語に'parent == nil'を追加することですが、これは親エンティティのみを返します。たとえば、ユーザーがサブエンティティを検索している場合、要求されたサブエンティティは表示されません。
(提案された)解決策は、NSTreeControllerをサブクラス化し、現在表示されているエンティティを追跡するNSMutableSet変数を追加することです。この変数は、initで割り当て、deallocで解放する必要があります。
「fetchWithRequest:merge:error:」が呼び出されたら、セットを空にする必要があります(これを解放して再度割り当てるよりも効率的かどうかはわかりません)。エンティティが表示に追加されるたびに、セットにエンティティが含まれているかどうかを確認してください。そうでない場合は、追加します。それ以外の場合は、ルートに近い方(サブエンティティ)を見つけて、そのサブエンティティの場合はスキップするか、以前に含まれていたものと交換します。
パフォーマンスへの影響は比較的少ないはずだと思います(NSSetがハッシュを使用していることを考慮して)。私が抱えている問題は、この動作を追加するためにオーバーライドする正しいメソッドを見つけることです。具体的には、「fetchWithRequest:merge:error:」が呼び出された後、NSTreeControllerがフェッチされたエンティティを処理します。