#objective-c #cocoa #nsoutlineview #nstreecontroller
#objective-c #cocoa #nsoutlineview #nstreecontroller
Вопрос:
Предыстория проблемы:
У меня есть NSOutlineView с каждым столбцом таблицы, программно привязанным к упорядоченным объектам NSTreeController, поэтому нет необходимости привязывать selectionIndexPaths. Источником упорядоченных объектов NSTreeController является изменяемый массив. Я добавляю все узлы в NSTreeController динамически, выполняя - (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath;
в главном потоке. Я переопределил событие наведения курсора мыши NSOutlineView следующим образом: - (void)mouseDown:(NSEvent *)event { /*...myMethods...*/ [super mouseDown:event]; }
Проблема:
Когда узлы добавляются очень быстро, и я выполняю событие наведения курсора мыши на outlineView, тогда очень часто возникает следующая ситуация:
поток, который добавляет узлы в TreeController, прерывает последовательность (я полагаю), вызванную событием mouseDown, поэтому insertObject: atArrangedObjectIndexPath:
вызывается до этого setSelectionIndexPaths:
. Вот почему новое выделение в outlineView исчезает, а treeController все еще имеет старую версию selectedIndexPaths.
Я попробовал одно частичное решение: заблокировал мой insertObject:
метод (с помощью @synthesized(outlineView)
), чтобы он не мог полностью изменить outlineView, но это часто приводит к конфликту потоков и зависанию приложения.
Есть ли какие-либо идеи, как решить проблему с исчезающими выделениями?
Ответ №1:
Синхронизируйте инструкции в потоке обновления источника данных с потоком GCD цикла основного события. Таким образом, обработка событий наведения курсора мыши и обновление источника данных полностью сериализуются:
dispatch_async(dispatch_get_main_queue(), ^{
// data source update goes here
});