Сохранение данных в ApplicationDidEnterBackground завершается из-за задержки приостановки фонового потока

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

Я также хочу сохранить данные в файловой системе, когда пользователь переходит в фоновый режим, и использовать для этого 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 (и фактически даже после вызова исключения), что приводит к сбою сохранения файла из-за мутировавшего массива.

Есть ли у кого-нибудь какие-либо предложения о том, как лучше всего обеспечить сохранение файла только ПОСЛЕ приостановки фоновой очереди? Я бы предпочел не отменять обработку потока, если это возможно. Заранее спасибо.


person instAustralia    schedule 06.06.2014    source источник
comment
Если вы поддерживаете iOS7+, рассматривали ли вы возможность использования NSURLSession?   -  person Aditya Sinha    schedule 06.06.2014
comment
Спасибо за предложение, но в настоящее время я не могу перейти на NSURLSession.   -  person instAustralia    schedule 19.06.2014


Ответы (1)


Если у кого-то еще есть похожая проблема...

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

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

person instAustralia    schedule 18.06.2014