2

バックグラウンド

これは私の前の質問と同じ背景ですが、Outline ビューにはフェッチ述語がありません。

  • NSOutlineViewTrainingGroup エンティティを示すがあります。

  • 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. インターフェイスが一瞬応答しなくなります。これは大したことではありませんが、インターフェイスで予測できない小さな一時停止が発生することを意味します。

  2. アウトライン ビューは、再びマージされた各バッチを更新します。

  3. 割り当てられたグループの下の一部のプロジェクトは空白のままです。オブジェクトはプロジェクトに割り当てられていますが、アウトライン ビューはプロジェクトを適切に更新していません。おそらく、メインスレッドがマージによって中断されるためです。

私が記録したスクリーンキャストでこれらの問題を確認できます。

http://screenr.com/Fk4

オルタナティブ

各操作からの変更を、バックグラウンド スレッドで実行されている管理オブジェクト コンテキストにマージできます。メインスレッドにメッセージを送信して、変更された最上位グループ内のすべてのオブジェクトを更新することができます。

これにより、上記の問題 1 と 3 は解消されるかもしれませんが、2 の問題は依然として残ると思います。

私の質問

これを行うより良い方法はありますか?

これを行う方法を作り直す前に(これがどのように機能するかをすでに変更しました)、より良い方法があるかどうか、またはこのアプローチに私が知らない欠点があるかどうかを知りたいです。

代替案についての提案を事前に感謝します。

4

1 に答える 1

0

私は現在、フリーズと一緒に暮らしています。しかし、答えは NSOperations を並行して実行し、マージにかかる時間を最小限に抑えることだと思います。操作をマージしやすくするために、データ モデルに加えることができる多くの改善点があることは間違いありません。

最近、バックグラウンド スレッドでマージを実装しようとしましたが、機能させるのに苦労しました。それは私が再訪するものになると思います。

于 2010-10-18T00:38:56.040 に答える