0

问题背景:

我有一个 NSOutlineView,每个 tableColumn 都以编程方式绑定到 NSTreeController 的排列对象,因此无需绑定 selectionIndexPaths。NSTreeController 的排列对象的来源是一个 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:在 then 之前调用setSelectionIndexPaths:。这就是为什么 outlineView 中的新选择消失了,而 treeController 仍然有旧版本的selectedIndexPaths的原因。

我尝试了一种部分解决方案:阻止我的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 回答