在mouseDown经常中断后,NSTreeController的selectionIndexPaths更新

时间:2011-04-27 18:58:01

标签: objective-c cocoa nsoutlineview nstreecontroller

问题背景:

我有一个NSOutlineView,每个tableColumn都以编程方式绑定到NSTreeController的arrangeObjects,因此不需要绑定selectionIndexPaths。 NSTreeController的arrangeObjects的源代码是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

我尝试了一个部分解决方案:阻止了我的insertObject:方法(使用@synthesized(outlineView)),这样它就无法更改整个outlineView,但它经常会在线程冲突和应用程序冻结中上升。

有没有想法如何解决选择消失的问题?

1 个答案:

答案 0 :(得分:0)

将数据源更新线程中的语句与主事件循环GCD线程同步。这样,mouseDown事件处理和数据源更新就完全序列化了:

dispatch_async(dispatch_get_main_queue(), ^{
  // data source update goes here
});