0

問題の背景:

NSOutlineViewがあり、すべてのtableColumnがプログラムでNSTreeControllerのarrangedObjectsにバインドされているため、selectionIndexPathsをバインドする必要はありません。NSTreeControllerのarrangedObjectsのソースはmutableArrayです。- (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath;メインスレッドで実行することにより、すべてのノードを動的にNSTreeControllerに追加しています。NSOutlineViewのmouseDownイベントを次のようにオーバーライドしました。 - (void)mouseDown:(NSEvent *)event { /*...myMethods...*/ [super mouseDown:event]; }

問題:

ノードが非常に高速に追加され、outlineViewでmouseDownイベントを実行すると、次の状況が頻繁に発生します。

TreeControllerにノードを追加するスレッドは、mouseDownイベントによって呼び出されるシーケンス(おそらく)を中断するため、そのinsertObject: atArrangedObjectIndexPath:前に呼び出されsetSelectionIndexPaths:ます。そのため、outlineViewの新しい選択は消え、treeControllerには古いバージョンのselectedIndexPathsが残っています

私は1つの部分的な解決策を試しました:outlineView全体を変更できないように、insertObject:メソッドを(で)ブロックしましたが、スレッドの競合が発生し、アプリがフリーズすることがよくあります。@synthesized(outlineView)

選択範囲が消える問題を解決する方法はありますか?

4

1 に答える 1

0

データソース更新スレッド内のステートメントをメイン イベント ループ GCD スレッドと同期します。このようにして、mouseDown イベントの処理とデータソースの更新が完全にシリアル化されます。

dispatch_async(dispatch_get_main_queue(), ^{
  // data source update goes here
});
于 2011-04-27T19:10:58.557 に答える