Обновление selectionIndexPaths в NSTreeController после mouseDown часто прерывается - PullRequest
0 голосов
/ 27 апреля 2011

Неполадка:

У меня есть NSOutlineView с каждым tableColumn, программно связанным с упорядоченными объектами NSTreeController, поэтому нет необходимости связывать selectionIndexPaths.Источник упорядоченных объектов NSTreeController представляет собой изменяемый массив.Я добавляю все узлы в NSTreeController динамически, выполняя - (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath; в основном потоке.Я переопределил событие mouseDown в NSOutlineView следующим образом: - (void)mouseDown:(NSEvent *)event { /*...myMethods...*/ [super mouseDown:event]; }

Проблема:

Когда узлы добавляются очень быстро, и я выполняю событие mouseDown для outlineView, затем очень частопроисходит следующая ситуация:

поток, который добавляет узлы в TreeController, прерывает последовательность (я полагаю), вызванную событием mouseDown, поэтому insertObject: atArrangedObjectIndexPath: вызывается до setSelectionIndexPaths:.Вот почему новый выбор в outlineView исчезает, а treeController все еще имеет старую версию selectedIndexPaths .

Я попробовал одно частичное решение: заблокировал мой метод insertObject:@synthesized(outlineView))так что он не может изменить весь outlineView, но он часто возникает при конфликте потоков и зависании приложения.

Есть ли идеи, как решить проблему с исчезающими выделениями?

1 Ответ

0 голосов
/ 27 апреля 2011

Синхронизируйте операторы в потоке обновления источника данных с потоком GCD цикла основного события. Таким образом, обработка события mouseDown и обновление источника данных полностью сериализуются:

dispatch_async(dispatch_get_main_queue(), ^{
  // data source update goes here
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...