Я думаю, что это не сложно реализовать. Вот моя стратегия:
1 / У вас есть массив задач (проще говоря, просто массив URL-адресов) для хранения списка URL-адресов для загрузки
2 / У вас может быть одноэлементный объект, который всякий раз, когда вы помещаете URL в очередь, вы информируете об этом.
3 / Когда объект-одиночка получает информацию, он проверяет, свободен ли он для выполнения работы. Если это так, он берет первый URL из очереди, вызывает асинхронный запрос к серверу. Он установил свое состояние, чтобы быть занятым.
4 / Когда асинхронный запрос перезвонит, синглтон снова проверяет очередь, чтобы убедиться, что она пуста. Если это не так, то получите следующий URL, повторите шаг 3. Если он пуст, то объект-одиночка устанавливает свое состояние как свободное, тогда следующий объект, помещающий что-либо в очередь загрузки, может сообщить об этом объекту-одиночке.
Вы можете иметь много асинхронных запросов одновременно, сверяясь с постоянным числом. И да, вы можете вызвать асинхронный запрос с библиотекой ASIHTTPRequest.
Я не знаю, есть ли какая-нибудь библиотека, выполняющая эту работу за вас, но я думаю, что это легко реализовать.