Фон
Это тот же фон, что и у моего предыдущего вопроса , за исключением того, что в представлении Схема нет предиката выборки.
У меня есть NSOutlineView
, который показывает сущности TrainingGroup.
NSOutlineView
связан с NSTreeController
ВNSTreeController, у меня отмечен флажок «Сохранить выделение» и снят флажок «Выбрать вставленные объекты».
Каждая группа обучения представляет папку на локальном компьютере.
Каждая обучающая группа может быть назначена проекту.Проект должен распространяться на всех потомков этой группы.
Столбец проекта привязан к свойству проекта каждой обучающей группы.
Естьмного данных в этом представлении.Поскольку каждая запись имеет запись, в одном обучающем представлении может быть в общей сложности ~ 15000 потомков.
Представление структуры
Деревовыглядит следующим образом:
Name Project
Users nil
John nil
Documents nil
Acme Project Acme Project
Proposal.doc Acme Project
12:32-12:33 Acme Project
13:11-13:33 Acme Project
... thousands more here!
Budget.xls Acme Project
Big Co Project Big Co Project
Deadlines.txt Big Co Project
Spec.doc Big Co Project
New Project nil
StartingUp.doc nil
Personal Stuff Personal
MyTreehouse.doc Personal
Movies nil
Aliens.mov nil
StepMom.mov nil
При назначении проекта
При редактировании проекта назначение всем дочерним элементам происходит на NSOperation
подкласс в фоновом потоке, так что пользователь может делать другие выборки и перемещаться, пока обрабатываются все потомки.
Когда операция завершена, я запускаю метод mergeChangesFromContextDidSaveNotification:
основной контекст управляемого объекта:
mainContext = [[NSApp delegate] managedObjectContext];
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
Функционально это работает нормально - все потомки назначаются проекту, когда контекст сливается обратно вmain.
Проблема
При слиянии NSOutlineView
, привязанный к основному контексту, зависает, и слияние может занять несколько секунд.завершено.
Чтобы уменьшить это замораживание, я выпилвверх групп для назначения в несколько меньших операций.
С этим подходом пакетной фоновой операции есть три проблемы:
Интерфейс перестает отвечать на запросыдоли секунды.Это не такая уж большая проблема, но это означает небольшие непредсказуемые паузы в интерфейсе.
В режиме структуры обновляется каждый объединенный пакет. При этом выборможет быть сбой.
Некоторые проекты в назначенных группах остаются пустыми.Объект был назначен проекту, но представление структуры не обновило проект должным образом.Предположительно, потому что основной поток прерывается слияниями.
Вы можете увидеть эти проблемы в записанном мною скриншоте:
http://screenr.com/Fk4
Альтернатива
Я мог бы объединить изменения каждой операции в контекст управляемого объекта, работающий в фоновом потоке.Возможно, я мог бы послать сообщение в основной поток, чтобы обновить все объекты в группе верхнего уровня, которая была изменена.
Это может избавить от проблем 1 и 3 выше, но я думаю, что 2 все еще будет проблемой.
Мой вопрос
Есть ли лучший способ сделать это?
Прежде чем я начну переделывать, как я это делаю (я уже изменилсякак это работает однажды) Я хочу знать, есть ли лучший способ или есть какие-то недостатки этого подхода, о которых я не знаю.
Заранее благодарен за любые предложения по альтернативам.