Предотвратить перекрытие события NSManagedObjectContextDidSaveNotification - PullRequest
2 голосов
/ 02 февраля 2011

Хорошо, у меня очень сложная проблема, которую я потратил несколько дней, чтобы понять, и знаю, что не знаю, как ее исправить.

У меня база данных CoreData обновлена ​​из другого потока с другим контекстом. Моя проблема заключается в том, что иногда NSManagedObjectContextDidSaveNotification событие перекрываются и создают повреждение базы, что приводит к падению. Вот пример:

Thread                   Main                                          NSFetchResultsController

Update database
Save database           NSManagedObjectContextDidSaveNotification1
                        merge                                          delegate process 1
                                                                       process 1 done

Update database
Save database           NSManagedObjectContextDidSaveNotification2
                        merge                                          delegate process 2
                                                                       process 2 done
Update database
Save database           NSManagedObjectContextDidSaveNotification3
                        merge                                          delegate process 3

Update database
Save database           NSManagedObjectContextDidSaveNotification4
                        merge          

                                                                       process 3 done
                                                                       delegate process 4
                                                                       CRASH
                                                                       process 4 done

В этом примере псевдокода process1 и process2 работают без проблем. но иногда основной поток получает перекрывающееся событие обновления и у вас process4 начинает читать базу данных до завершения process3.

Есть ли официальный способ справиться с этим? CoreData предлагает решение в этой ситуации, или я должен использовать NSLock?

Спасибо

1 Ответ

2 голосов
/ 02 февраля 2011

Контексты должны блокировать постоянный координатор хранилища, который они совместно используют, чтобы предотвратить эти проблемы.

Если процесс 3 и процесс 4 выполняются в основном потоке, то как можно запустить 4 до завершения 3? Не забывайте, что уведомления поступают в поток, который их публикует, поэтому вам нужно явно выполнить свой код, чтобы объединить изменения в основном потоке (извиняюсь, если я утверждаю очевидное).

...