В настоящее время мое приложение загружает данные из веб-службы. Полученные данные обрабатываются с помощью фоновых последовательных очередей.
Я также хочу сохранить данные в файловой системе, когда пользователь переходит в фоновый режим, и использовать для этого NSCoder. По рекомендации Apple я включил логику сохранения файла в метод ApplicationDidEnterBackground делегата приложения.
Однако у меня возникают проблемы с обеспечением того, чтобы данные не изменялись до вызова сохранения в файловой системе, потому что пауза в фоновом потоке не вызывается немедленно.
Например, запускается обновление клиентских данных и возвращается более 2000 записей (простая схема данных). Однако, пока это работает, пользователь нажимает кнопку «Домой», и приложение переходит в фоновый режим и пытается сохранить данные в файловой системе.
В блочную обработку фонового потока я включил логику для регистрации добавления клиентов в массив, а также включил сообщения NSLog, сообщающие мне, когда вызывается метод ApplicationDidEnterBackground. Вот соответствующие части результатов регистрации:
2014-06-06 12:32:02.360 MyApp[629:190049] Added client
2014-06-06 12:32:02.365 MyApp[629:190049] Added client
2014-06-06 12:32:02.416 MyApp[629:189936] This is a call to applicationDidEnterBackground to save data to file
2014-06-06 12:32:02.371 MyApp[629:190049] Added client
. . . (Log continues with Added Client messages)
2014-06-06 12:32:03.952 MyApp[629:190049] Added client
2014-06-06 12:32:03.951 MyApp[629:189936] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x157c74f0> was mutated while being enumerated.'
*** First throw call stack:
(0x23df543b 0x3096ed1f 0x23df4ec1 0x24ab44e7 0x24ab4ad9 0x24ab32ed 0x24affb53 0x4f879 0x4f71b 0x2a257 0x2762021d 0x2761c51d 0x2a32ae27 0x2a3319f5 0x23dbd135 0x23dbc3f9 0x23dbaf53 0x23d077e1 0x23d075f3 0x2ae5a261 0x27412e3d 0x27e4b 0x30f07aaf)
libc++abi.dylib: terminating with uncaught exception of type NSException
2014-06-06 12:32:03.960 MyApp[629:190049] Added client
2014-06-06 12:32:08.025 MyApp[629:190049] Added client
2014-06-06 12:32:08.028 MyApp[629:190049] Added client
2014-06-06 12:32:08.030 MyApp[629:190049] Added client
Как видно из логов, обработка блоков фонового потока продолжает обрабатывать записи даже после вызова ApplicationDidEnterBackground (и фактически даже после вызова исключения), что приводит к сбою сохранения файла из-за мутировавшего массива.
Есть ли у кого-нибудь какие-либо предложения о том, как лучше всего обеспечить сохранение файла только ПОСЛЕ приостановки фоновой очереди? Я бы предпочел не отменять обработку потока, если это возможно. Заранее спасибо.