Соответствие CoreData сохранить уведомления для обратных вызовов - PullRequest
2 голосов
/ 14 июня 2011

Я бы хотел выбрать чей-то мозг на этом.У меня есть выделенная очередь сохранения NSManagedObjectContext и GCD, из которой я оперирую.И когда новые данные поступают в мое приложение, я сохраняю их в этом контексте и объединяю изменения с основным контекстом.Моя проблема возникает в том, чтобы рассказать основной теме, что только что произошло.Сразу после вызова save мой текущий контекст теперь актуален, но если я запускаю метод в основном контексте, это не контекст.Если я жду уведомления NSManagedObjectContextDidSave и сохраняю три раза, у меня теперь есть три вызова делегатов в очереди, но нет способа сопоставить их с поступающими уведомлениями. Кто-нибудь знает, как можно обойти это?

РЕДАКТИРОВАТЬ

В итоге я создал новый контекст для каждой операции сохранения и прикрепил блок, вызываемый при получении уведомления о сохранении.Похоже, это http://pastie.org/2068084

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Исходя из вашего ответа на мой комментарий выше, я вижу, что вы передаете управляемый объект Object в уведомлении. Я не настолько уверен в асинхронных вещах, но думаю, что вы нарушаете какое-то правило параллелизма, если я правильно интерпретирую эту цитату из NSManagedObjectContext Reference Class :

Параллельное Базовые данные используют ограничение потока (или сериализованной очереди) для защиты управляемых объектов и контекстов управляемых объектов (см. «Параллелизм с базовыми данными»). Следствием этого является то, что контекст предполагает, что владельцем по умолчанию является поток или очередь, которая его выделила - это определяется потоком, который вызывает его метод init. Поэтому не следует инициализировать контекст в одном потоке, а затем передавать его в другой поток. Вместо этого вы должны передать ссылку на постоянный координатор хранилища, и получающий поток / очередь создаст новый контекст, полученный из этого.

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

0 голосов
/ 14 июня 2011

Я не уверен, что вы подразумеваете под "... если я запускаю метод в основном контексте, это не контекст. Если я жду NSManagedObjectContextDidSave ..." контексты были объединены. Если это так, вот почему вы не можете получить доступ к данным, это просто не в переднем контексте.

Вы звоните mergeChangesFromContextDidSaveNotification: из переднего контекста после того, как получит уведомление?

...