Как обрабатывать несколько асинхронных загрузок - PullRequest
0 голосов
/ 28 сентября 2011

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

пользователь видит таблицу с двумя входами по одному для каждой базы данных. они могут нажать кнопку, чтобы загрузить базу данных, и когда начинается загрузка, запускается асинхронное URL-соединение и т. д. Это работает в определенной степени, но не все так просто.

вот что я хочу сделать.

  1. скачать основной URL обновления (работает нормально)
  2. , затем загрузите дополнительный URL.
  3. затем примените первый URL-адрес к хранилищу sqlite (код написан для этого)
  4. затем применить второй URL-адрес к хранилищу sqlite (код написан для этого)

(все время показывает прогресс пользователю)

когда загрузки были синхронизированы, это было легко, так как я просто ждал, пока они закончат, чтобы запустить следующее действие, но при использовании асинхронного метода я борюсь с тем, как заставить их ждать. Шаг 3 зависит от завершения шага 1, а шаг 4 - от завершения шага 2, а общий успех зависит от всех результатов. Шаг 4 должен дождаться завершения шага 3, иначе блокировки базы данных вызовут конфликт.

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

Кто-нибудь делал что-то подобное, и если да, то какую стратегию вы использовали для управления потоком событий?

Также я хотел обернуть все это в backgroundTask с ExpirationHandler, чтобы он выдержал нажатие пользователем кнопки home ... но методы делегата не вызываются, когда я это делаю.

1 Ответ

0 голосов
/ 24 февраля 2012

Хорошо. Вот что я сделал, чтобы решить проблему.

  1. Создал NSOperationQueue
  2. Добавил операции с URL-адресами как NSURLInnvocationOperations 3. Ожидал до тех пор, пока операции с URL-адресами не были завершены (waituntilalloperationsarefinished).

Затем установите максимальное число одновременных операций равным 1, что вынудило последующие операции базы данных выполняться последовательно один за другим и, таким образом, не позволило SQLite заблокировать самоотключение.

...