问题背景:
我有一个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,但它经常会在线程冲突和应用程序冻结中上升。
有没有想法如何解决选择消失的问题?
答案 0 :(得分:0)
将数据源更新线程中的语句与主事件循环GCD线程同步。这样,mouseDown事件处理和数据源更新就完全序列化了:
dispatch_async(dispatch_get_main_queue(), ^{
// data source update goes here
});