Что происходит, когда вы пытаетесь сохранить managedObjectContext из другого потока? - PullRequest
1 голос
/ 19 марта 2012

Итак, я знаю, что NSManagedObjects не являются потокобезопасными, а managedObjectID - и нам нужен отдельный managedObjectContext для каждого потока.Но недавно у меня возникла проблема, когда я выполнял некоторые основные изменения данных в фоновом режиме (для этого у меня был отдельный поток runloop) и executeSelectorOnThread: метод иногда просто не вызывался в этом потоке runloop.Оказалось, что причина была в том, что я выполнял

    [someObject.managedObjectContext save:&error]

в этом потоке runloop, а "someObject" был создан в главном потоке.Но это только "виснет" поток runloop время от времени.Поэтому вопрос в том, что действительно происходит, если вы пытаетесь сохранить контекст в другом потоке.Я просто ищу более глубокое понимание, спасибо.

Ответы [ 2 ]

1 голос
/ 19 марта 2012

С https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/NSManagedObjectContext.html:

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

0 голосов
/ 19 марта 2012

Вы потерпите крах. Возможно, это будет иногда работать, и вы не увидите сбоя во время отладки, но вы никогда не должны этого делать. Контексты объектов и управляемые объекты в них должны использоваться только в том потоке, в котором они были созданы. В документации Apple об этом ясно сказано, и в ней приводится много примеров того, как справляться с ситуациями, когда у вас могут быть длительные операции (медленные выборки или асинхронное сохранение). Для получения дополнительной информации вам следует прочитать документы, в которых говорится о многопоточности с Core Data.

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