Сохранение фона с Core Data? - PullRequest
       5

Сохранение фона с Core Data?

9 голосов
/ 26 января 2010

У меня есть приложение для iPhone на базе Core Data, которое требует сохранения 1000 управляемых объектов при завершении. Это занимает 8+ секунд, однако ОС убивает приложение, если оно не завершается в течение ок. 6 секунд.

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

Можно ли как-то сохранить объекты ранее в фоновом потоке, при этом все еще имея (только для чтения) доступ к NSManagedObjectContext в основном потоке для отображения данных? Или как-то возможно дублировать управляемые объекты и передать их в фоновый поток для сохранения?

Для пояснения, вот что сейчас происходит в приложении: у меня есть фоновый поток, который импортирует более 1000 объектов за 1 сек. Если я сохраняю во время импорта, это занимает намного больше времени, чем 1 сек. Таким образом, чтобы отобразить эти элементы с минимальной задержкой, контекст передается без сохранения в основной поток, и пользователь получает свои результаты как можно быстрее.

Теперь у меня есть проблема, как сохранить эти объекты без необходимости ждать 8 секунд. Если я сохраню в фоновом потоке перед передачей, пользователь должен ждать. Если я сохраню в переднем плане поток после передачи, пользователь должен ждать. Сейчас я вижу только два возможных подхода:

  1. Каким-то образом данные ядра получают доступ к sqlite в фоновом режиме, при этом основной поток остается реактивным
  2. Передача несохраненных объектов из одного контекста в другой и сохранение в фоновом потоке

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

С уважением, Jochen

1 Ответ

8 голосов
/ 26 января 2010

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

Я только что написал короткий ответ на аналогичный вопрос здесь, на SO , но вы должны прочитать это Apple doc . Есть много потенциальных ловушек, поэтому читайте очень, очень внимательно. А затем прочитайте «Эффективный импорт данных» от Apple . Это также необходимо прочитать! И книга Маркуса Зарры CoreData также полезна.

Многопоточность CoreData немного сложна, но она действительно окупается. Удачи!

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