Правильный подход для безопасного сохранения контекста управляемого объекта Core Data в фоновом потоке?

Документация Apple «Параллелизм с базовыми данными» утверждает следующее при обсуждении использования основных данных с фоновыми потоками.

Сохранение в фоновом потоке подвержено ошибкам

Асинхронные очереди и потоки не предотвращают завершение работы приложения. (В частности, все потоки на основе NSThread являются «отсоединенными» — полную информацию см. в документации по pthread — и процесс выполняется только до тех пор, пока не будут завершены все неотсоединенные потоки.)

и в частности:

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

Каков рекомендуемый подход для достижения этого в приложении IOS?


person lucasweb    schedule 22.04.2011    source источник


Ответы (2)


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

person TechZen    schedule 22.04.2011
comment
+1 Верно, но обязательно обратите внимание, что связанные методы включают applicationDidEnterBackground - приложение может перейти в фоновый режим, а затем приостановиться и завершить работу без какого-либо дополнительного уведомления. - person David Gelhar; 22.04.2011
comment
Спасибо. Я мало что делал с потоками внутри среды IOS, у вас есть какой-то пример кода или вы могли бы указать мне направление какой-либо документации о том, как получить доступ и проверить поток на наличие несохраненных изменений внутри класса делегата приложения . - person lucasweb; 22.04.2011
comment
Все зависит от того, как вы реализовали потоки на самом деле. Например, если вы используете NSOperationQueue, может пригодиться waitUntilAllOperationsAreFinished. - person paulbailey; 29.07.2012

Я рекомендую взглянуть на использование Magical Record (https://github.com/magicalpanda/MagicalRecord/ ). Это значительно упрощает работу с основными данными в фоновых потоках. Я недавно нашел это и использовал для проекта. Теперь мы предприняли усилия по техническому обслуживанию, чтобы обновить множество существующих приложений, чтобы использовать новую оболочку Magical Record Core Data. Это сэкономило нам массу времени и разочарований за несколько недель, когда мы его использовали.

person radesix    schedule 04.08.2012