Недавно я переместил свои фоновые синхронизированные загрузки в контроллер представления и мне нужен совет, как лучше всего справиться с ними в асинхронном режиме. Я написал весь код, чтобы показать прогресс просмотра по мере загрузки, но, как вы уже догадались, все не так просто. Вот как это работает.
пользователь видит таблицу с двумя входами по одному для каждой базы данных. они могут нажать кнопку, чтобы загрузить базу данных, и когда начинается загрузка, запускается асинхронное URL-соединение и т. д. Это работает в определенной степени, но не все так просто.
вот что я хочу сделать.
- скачать основной URL обновления (работает нормально)
- , затем загрузите дополнительный URL.
- затем примените первый URL-адрес к хранилищу sqlite (код написан для этого)
- затем применить второй URL-адрес к хранилищу sqlite (код написан для этого)
(все время показывает прогресс пользователю)
когда загрузки были синхронизированы, это было легко, так как я просто ждал, пока они закончат, чтобы запустить следующее действие, но при использовании асинхронного метода я борюсь с тем, как заставить их ждать. Шаг 3 зависит от завершения шага 1, а шаг 4 - от завершения шага 2, а общий успех зависит от всех результатов. Шаг 4 должен дождаться завершения шага 3, иначе блокировки базы данных вызовут конфликт.
Второе осложнение состоит в том, что если пользователь нажимает вторую кнопку во время загрузки первой, то шаги 3, 4 будут конфликтовать, если они будут выполнены одновременно с доступом первой строки к базе данных.
Кто-нибудь делал что-то подобное, и если да, то какую стратегию вы использовали для управления потоком событий?
Также я хотел обернуть все это в backgroundTask с ExpirationHandler, чтобы он выдержал нажатие пользователем кнопки home ... но методы делегата не вызываются, когда я это делаю.