バックグラウンド
これは私の前の質問と同じ背景ですが、Outline ビューにはフェッチ述語がありません。
NSOutlineView
TrainingGroup エンティティを示すがあります。は
NSOutlineView
にバインドされていますNSTreeController
NSTreeController では、「選択を保持する」にチェックを入れ、「挿入されたオブジェクトを選択する」のチェックを外しました。
各 TrainingGroup は、ローカル マシン上のフォルダーを表します。
各 TrainingGroup をプロジェクトに割り当てることができます。プロジェクトは、そのグループのすべての子孫に伝播する必要があります。
プロジェクト列は、各トレーニング グループのプロジェクト プロパティにバインドされます。
このビューには多くのデータがあります。各エントリにはエントリがあるため、1 つのトレーニング ビューの下に合計で最大 15000 の子孫が存在する可能性があります。
アウトライン表示
ツリーは次のようになります。
Name Project
Users nil
John nil
Documents nil
Acme Project Acme Project
Proposal.doc Acme Project
12:32-12:33 Acme Project
13:11-13:33 Acme Project
... thousands more here!
Budget.xls Acme Project
Big Co Project Big Co Project
Deadlines.txt Big Co Project
Spec.doc Big Co Project
New Project nil
StartingUp.doc nil
Personal Stuff Personal
MyTreehouse.doc Personal
Movies nil
Aliens.mov nil
StepMom.mov nil
プロジェクト割り当て時
プロジェクトが編集されると、すべての子への割り当てが
NSOperation
バックグラウンド スレッドのサブクラスで行われるため、ユーザーは自由に他の選択を行ったり、すべての子孫が処理されている間に移動したりできます。操作が完了したら、
mergeChangesFromContextDidSaveNotification:
メインのマネージド オブジェクト コンテキストでメソッドを実行します。mainContext = [[NSApp delegate] managedObjectContext];
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) withObject:notification waitUntilDone:YES];
機能的には、これは正常に機能します。コンテキストがメインにマージされると、すべての子孫がプロジェクトに割り当てられます。
問題
マージ時に
NSOutlineView
、メイン コンテキストにバインドされている がフリーズし、マージが完了するまでに数秒かかる場合があります。このフリーズを減らすために、いくつかの小さな操作に割り当てるグループをまとめました。
このバッチ処理されたバックグラウンド操作のアプローチには、次の 3 つの問題があります。
インターフェイスが一瞬応答しなくなります。これは大したことではありませんが、インターフェイスで予測できない小さな一時停止が発生することを意味します。
アウトライン ビューは、再びマージされた各バッチを更新します。
割り当てられたグループの下の一部のプロジェクトは空白のままです。オブジェクトはプロジェクトに割り当てられていますが、アウトライン ビューはプロジェクトを適切に更新していません。おそらく、メインスレッドがマージによって中断されるためです。
私が記録したスクリーンキャストでこれらの問題を確認できます。
オルタナティブ
各操作からの変更を、バックグラウンド スレッドで実行されている管理オブジェクト コンテキストにマージできます。メインスレッドにメッセージを送信して、変更された最上位グループ内のすべてのオブジェクトを更新することができます。
これにより、上記の問題 1 と 3 は解消されるかもしれませんが、2 の問題は依然として残ると思います。
私の質問
これを行うより良い方法はありますか?
これを行う方法を作り直す前に(これがどのように機能するかをすでに変更しました)、より良い方法があるかどうか、またはこのアプローチに私が知らない欠点があるかどうかを知りたいです。
代替案についての提案を事前に感謝します。