Блокировка NSManagedObjectContext из 2 последовательных очередей - PullRequest
0 голосов
/ 16 марта 2012

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

Я предполагал, что это решит мои проблемы, связанные с потоками, которыедо сих пор, кажется, это было сделано, но теперь у меня другая проблема: если две последовательные очереди с разными MOC пытаются выполнить контекст, они оба блокируются, и приложение зависает.Так что я пропустил?

"... [I] Если вы создаете один контекст для потока, но все указывают на один и тот же постоянный координатор хранилища, Core Data заботится о доступе к координатору в поточно-безопасном режиме.путь (методы блокировки и разблокировки NSManagedObjectContext обрабатывают рекурсию). "( source )

Что я там прочитал, так это то, что Core Data должна правильно обрабатывать блокировку и разблокировку с моими настройками.Или я понимаю «поточно-ориентированным способом» неправильно в этом случае?

Редактировать: у меня есть словарь, который отображает очередь в контекст.Сначала я хотел работать с потоками, а не с очередями, пока не прочту эту часть:

"Примечание: вы можете использовать потоки, очереди последовательных операций или очереди отправки для параллелизма. Для краткости эта статьявезде используется «нить» для обозначения любого из них ».( источник )

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

Если под «последовательной очередью» вы подразумеваете очередь отправки GCD или NSOperationQueue, вы делаете неверные предположения о том, что каждая очередь имеет выделенный поток или что задачи для каждой очереди всегда выполняются в одном и том же потоке.

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

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

JeremyP прав: очереди не == темы.Очередь может создавать новый поток для каждой операции - для базовых данных (в режиме по умолчанию) требуется ограничение потока (то есть поток, создавший NSManagedObjectContext, должен быть потоком, используемым для всего доступа к любым объектам из этого контекста).

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

...