2013-06-19 2 views
0

Как указано в заголовке, executeFetchRequest в Core Data медленнее «несколько раз», и он даже может блокировать пользовательский интерфейс.Основные данные executeFetchRequest slow

У меня есть подозрение, потому что другой поток сохраняет данные в Core Data, что мешает мне выполнить выборку.

Я не могу сохранить данные в фоновом потоке и выполнить выборку, так как у меня будет шанс получить устаревшие данные прямо?

Как я могу это решить?

+0

Если вы выполняете свои запросы в основном потоке, есть вероятность, что пользовательский интерфейс может быть заблокирован. Coupd вы показываете часть своего кода? –

+1

Если «другой поток сохраняет данные в Core Data», как вы можете сказать «Я не могу сохранить данные в фоновом потоке и выполнить выборку»? Вы используете несколько потоков или нет? Насколько велика прибыль, которую вы делаете? – Wain

ответ

1

Эта страница является прекрасным объяснением того, как улучшить дизайн вашего основного стека данных. http://www.cocoanetics.com/2012/07/multi-context-coredata/

По существу, суть в том, что у вас есть фоновый контекст (NSPrivateQueueConcurrencyType), который взаимодействует с вашим постоянным координатором магазина. Это означает, что все дорогие операции записи на диск будут происходить в фоновом режиме, оставив ваш основной поток разблокированным. Затем у вас есть основной NSManagedObjectContext, который обрабатывает большинство взаимодействий с основными данными. Наконец, всякий раз, когда вы импортируете множество новых записей или выполняете большую обработку, вы можете создать дочерний контекст и установить его родительский объект в качестве основного контекста. Таким образом, вы сохраняете дочерний элемент, и изменения переносятся в основной контекст, а затем в дальнейшем основной контекст автоматически сохраняется, а затем фоновый контекст записывает изменения на диск.

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

Смежные вопросы