Как я могу сделать свое приложение более отзывчивым? - PullRequest
2 голосов
/ 03 октября 2010

Фон

Это тот же фон, что и у моего предыдущего вопроса , за исключением того, что в представлении Схема нет предиката выборки.

  • У меня есть 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, привязанный к основному контексту, зависает, и слияние может занять несколько секунд.завершено.

  • Чтобы уменьшить это замораживание, я выпилвверх групп для назначения в несколько меньших операций.

С этим подходом пакетной фоновой операции есть три проблемы:

  1. Интерфейс перестает отвечать на запросыдоли секунды.Это не такая уж большая проблема, но это означает небольшие непредсказуемые паузы в интерфейсе.

  2. В режиме структуры обновляется каждый объединенный пакет. При этом выборможет быть сбой.

  3. Некоторые проекты в назначенных группах остаются пустыми.Объект был назначен проекту, но представление структуры не обновило проект должным образом.Предположительно, потому что основной поток прерывается слияниями.

Вы можете увидеть эти проблемы в записанном мною скриншоте:

http://screenr.com/Fk4

Альтернатива

Я мог бы объединить изменения каждой операции в контекст управляемого объекта, работающий в фоновом потоке.Возможно, я мог бы послать сообщение в основной поток, чтобы обновить все объекты в группе верхнего уровня, которая была изменена.

Это может избавить от проблем 1 и 3 выше, но я думаю, что 2 все еще будет проблемой.

Мой вопрос

Есть ли лучший способ сделать это?

Прежде чем я начну переделывать, как я это делаю (я уже изменилсякак это работает однажды) Я хочу знать, есть ли лучший способ или есть какие-то недостатки этого подхода, о которых я не знаю.

Заранее благодарен за любые предложения по альтернативам.

1 Ответ

0 голосов
/ 18 октября 2010

Я сейчас живу с заморозкой. Но я думаю, что ответ состоит в том, чтобы распараллелить мои операции NSO и просто сократить время, необходимое для объединения до минимума. Несомненно, я могу внести множество улучшений в модель данных, чтобы упростить объединение операций.

Я недавно пытался реализовать слияние в фоновом потоке, но изо всех сил пытался заставить его работать. Думаю, это будет что-то, к чему я вернусь.

...