Я работаю над приложением для iPad, которое использует сокеты для связи с другим приложением, и у меня много проблем с выяснением того, как реализовать тайм-аут при отправке данных в мое серверное приложение.
У меня есть 3 команды, которые я отправляю на сервер в зависимости от того, какой тип информации мне нужен, одна из этих команд всегда отправляет ответ, а две другие - нет, поэтому мне нужно время ожидания в моем приложении, чтобы узнать, когдасервер не отправил ответ.
Когда я создаю сокет, я регистрирую обратный вызов, который вызывается при поступлении данных, этот обратный вызов должен прослушиваться в фоновом режиме, но я заметил, что если я отправляю данные,и приостановить основной поток приложения (приостановить его на некоторое время или с помощью функции сна), обратный вызов никогда не вызывается.
Поскольку я не могу сделать ожидание в главном потоке, я решил создатьотдельный поток, в этом потоке я сплю в течение определенного времени (тайм-аут), и после этого я проверяю флаг tЭто значение устанавливается только в том случае, если вызывается метод обратного вызова (другими словами, если сервер отправляет мне ответ), и если этот флаг не установлен, то я знаю запрос на тайм-аут сервера и могу двигаться вперед.
Теперь проблема в том, что у меня есть методы, которые отправляют 50 запросов на сервер, логика выглядит следующим образом:
method1 отправляет запрос и запускает ожидающий поток (для проверки таймаута)
ожидающий поток спит в течение n секунд
a - если данные поступают, когда ожидающий поток находится в спящем режиме, вызывается метод обратного вызова, задайтефлаг, указывающий, что данные поступили, выполните некоторые действия и вызовите method1, и цикл начинается с
b - если данные не поступают, флаг поступивших данных остается ложным
ожидающий поток просыпается, проверьте наличие флага прибывающих данных
a - если флаг верен (данные получены), выйдите из потока
b - если флаг ложен (данныене прибыл), вызвать method1 и выйти из потока
Но работа таким образом создает много проблем для моего приложения, не ведет себя должным образом, и иногда это портит вызовы, и во время отладки я вижу, что поток задержки вызывается многимивремя от времени, когда он должен вызываться только один раз в каждом цикле (вы можете думать о цикле, как переход от 1 к 4, см. выше), поэтому я предполагаю, что причина моих проблем заключается в том, как яя использую время ожидания, потому что, если я попытаюсь выполнить команду, которая всегда отправляет ответ, у меня не возникнет никаких проблем.
Кто-нибудь может мне помочь с лучшим способом реализовать ожидание ожидания?
Спасибо.