Допустим, что если я прочитал с www.example.com/number, я получу случайное число.В моем приложении для iPhone я хочу иметь возможность непрерывно считывать с этого адреса и отображать новый номер на экране после завершения каждого запроса.Давайте также предположим, что я хочу, чтобы этот процесс запустился, как только загрузится представление.Наконец, в качестве дополнительного примечания я использую ASIHTTPRequest для упрощения веб-запросов.
Подход 1. В моем методе viewDidLoad я мог синхронно считывать URL-адрес в цикле (выполнение не будет продолжено, пока я не получу ответ от HTTP-запроса).Плюсы: запросы являются последовательными, и у меня есть полный контроль, чтобы ответить на каждый.Минусы: пользовательский интерфейс никогда не обновляется, потому что я никогда не выхожу из функции и не возвращаю управление циклу времени выполнения.Понятно, что это не очень хорошее решение.
Подход 2: В моем методе viewDidLoad я создаю таймер, который вызывает функцию fetchURL раз в секунду.Плюсы: каждый запрос находится в отдельном потоке, а пользовательский интерфейс обновляется после завершения каждого запроса.Минусы: запросы находятся в отдельных потоках, и не могут быть хорошо контролируются.Например, если по первому запросу есть тайм-аут соединения, я хочу иметь возможность отображать всплывающее окно с ошибкой, и больше никаких запросов не происходит, пока настройки не будут изменены.Однако при таком подходе, если тайм-аут занимает 3 секунды, за это время уже будут запущены два дополнительных запроса.Если я просто замедляю таймер, тогда данные приходят слишком медленно, когда соединение работает хорошо.
Похоже, что должен быть какой-то подход, который бы объединил преимущества первых двух подходов, которые я упомянул.Я хотел бы, чтобы я мог решить, стоит ли отправлять следующий запрос, основываясь на результате предыдущего запроса.
Подход 3: Я подумал об использовании таймера, который срабатывает быстрее (скажем, каждые 0,25 секунды), но функция таймера проверяет флаг, чтобы увидеть, что делать дальше.Таким образом, если предыдущий запрос завершен, он отправляет новый запрос (если не было ошибки).В противном случае, если предыдущий запрос не завершен, функция таймера возвращается без отправки нового запроса.При более быстром срабатывании этого таймера вы получите лучшее время отклика, но флаг позволит мне получить необходимую синхронизацию.
Кажется, что подход 3 будет делать то, что я хочу, но это также кажется немного вынужденным.У кого-нибудь есть предложение для лучшего подхода к этому, или что-то вроде подхода 3 является лучшим способом сделать это?