Бесконечное сохранение контекста CoreData - PullRequest
2 голосов
/ 29 мая 2010

Иногда я замечал, что операция 'save:' и ManagedObjectContext никогда не возвращаются и потребляют 100% ЦП.

Я использую SQL Store в среде GarbageCollected (Mac OS X 10.6.3). Активность диска показывает около 700 КБ / с записи. При просмотре папки, содержащей файл базы данных sqlite, файл -journal появляется и исчезает, появляется и исчезает, ...

Это часть графа вызовов из анализа процесса:

  2203 -[NSManagedObjectContext save:]
    1899 -[NSPersistentStoreCoordinator(_NSInternalMethods) executeRequest:withContext:]
      1836 -[NSSQLCore executeRequest:withContext:]
        1836 -[NSSQLCore saveChanges:]
          1479 -[NSSQLCore performChanges]
            ...
          335 -[NSSQLCore recordChangesInContext:]
            ...
          20 -[NSSQLCore rollbackChanges]
            ...
          2 -[NSSQLCore prepareForSave:]
            ...
      62 -[NSPersistentStoreCoordinator(_NSInternalMethods) _checkRequestForStore:originalRequest:andOptimisticLocking:]
        ...
      1 -[NSPersistentStore(_NSInternalMethods) _preflightCrossCheck]
        ...
    184 -[NSMergePolicy resolveConflicts:]
      ...
    120 -[NSManagedObjectContext(_NSInternalChangeProcessing) _prepareForPushChanges:]
      ...

Все происходит в главном потоке графического интерфейса.

Есть идеи, что я могу сделать, чтобы решить проблему?

Ответы [ 2 ]

3 голосов
/ 04 июня 2010

Спасибо Маркусу за подсказку, что это петля!Но этот цикл не был вызван наблюдателем для уведомления.

Причиной цикла является ошибка (я думаю, что она одна) в CoreData: одна из сущностей, сохраненных в этой ситуации, имеетсвойство типа Double.И стоимость имущества была изменена.Поэтому CoreData сравнивает сохраненное значение с кэшированным значением, и иногда десятичные цифры заставляют CoreData NSSQLCore «думать», что сохраненные значения были изменены извне.

Обычно это приводит к сбою метода save:и вернуть NSError, но в моем случае настроил NSManagedObjectContext для использования политики слияния NSMergeByPropertyObjectTrumpMergePolicy.Поэтому, поскольку CoreData ложно полагает, что произошли внешние изменения, он просто принимает значение свойства в памяти (которое имеет некоторые «неблагоприятные» цифры) и сохраняет его.После этого он сравнивает сохраненное значение со значением в памяти и снова обнаруживает неравенство, выполняет откат и снова сохраняет значение - это цикл.

Поскольку я заставляю свойство Double хранить NSNumber объекты, которые содержат целочисленные значения, save: успешно.

Эта ссылка текст ссылки помогла мне найти выход.

Я НЕ CoreData специалист, так что я не уверен, что все правильно объяснили.

0 голосов
/ 30 мая 2010

Очевидно, что у вас, скорее всего, есть петля. Вы отслеживаете или реагируете на NSNotification, транслируемый NSManagedObjectContext? Обычно это единственное, что вызывает такой цикл.

Используете ли вы какие-либо потоки?

Обновление

Выключите наблюдателя сохранения и посмотрите, существует ли петля. Не видя ваш код, это лучшее предположение относительно причины вашего цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...