Многопоточное использование Core Data (NSOperationQueue и NSManagedObjectContext) - PullRequest
14 голосов
/ 21 сентября 2009

В документации Apple Core Data для Параллелизма с базовыми данными они перечисляют предпочтительный метод обеспечения безопасности потоков, как использование отдельного NSManagedObjectContext для потока с общим NSPersistentStoreCoordinator.

Если у меня есть несколько NSOperations, выполняющихся одна за другой в NSOperationQueue, будут ли большие издержки при создании контекста с каждой задачей?

Поскольку максимальное количество одновременных операций NSOperationQueue равно 1, многие из моих операций будут использовать один и тот же поток. Могу ли я использовать словарь потока, чтобы создать один NSManagedObjectContext для потока? Если я это сделаю, у меня будут проблемы с очисткой моего контекста позже?

Как правильно использовать базовые данные в этом случае?

Ответы [ 3 ]

19 голосов
/ 21 сентября 2009

Правильный способ использования Core Data в этом случае - создать отдельный NSManagedObjectContext для каждой операции или , чтобы иметь единственный контекст, который вы блокируете (через -[NSManagedObjectContext lock] до использования и -[NSManagedObjectContext unlock] после использования). Блокированный подход может иметь смысл, если операции являются последовательными, и нет других потоков, использующих контекст.

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

2 голосов
/ 24 апреля 2013

Хотя этот вопрос старый, на самом деле он находится в верхней части результатов поиска Google по теме «Поток NSMangedObjectContext», поэтому я просто добавлю новый ответ.

Новый «предпочтительный» метод состоит в том, чтобы использовать initWithConcurrencyType: и сообщить MOC, является ли это MOC основного потока или moc вторичного потока. Затем вы можете использовать новые методы executeBlock: и executeBlockAndWait: и MOC позаботится о сериализации операций в своем «нативном» потоке.

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

2 голосов
/ 21 сентября 2009

Операции, запущенные с использованием NSOperationQueue с использованием максимального числа параллельных операций, равного 1, не будут запускать все операции в одном потоке. Операции будут выполняться одна за другой, но каждый раз будет создаваться новый поток.

Таким образом, создание объектов в словаре потоков будет бесполезным.

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