Обновление selectionIndexPaths NSTreeController после наведения курсора мыши часто прерывается

#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
});