При длительном опросе выполняется запрос на чтение к серверу, сервер получает запросы, обнаруживает, что отправлять вам ничего интересного, и вместо того, чтобы ничего не возвращать или «пустой», вместо этого удерживает запрос до чего-то интересный Как только он что-то находит, он пишет в сокет, и клиент получает данные.
Суть в том, что в течение всего этого времени, используя общее программирование сокетов, клиент блокируется и зависает на вызове чтения сокетов.
Есть два способа справиться с этим (ну, три, если вы не против застрять в главном потоке на несколько секунд, но давайте не будем считать это).
Поместите код обработки сокета в поток. В этом случае весь процесс сокета находится в независимом потоке в программе, поэтому он с радостью застрял в чтении в ожидании ответа.
Использовать асинхронную обработку сокетов. В этом случае чтение из вашего сокета НЕ блокирует основной поток. Вместо этого вы передаете функции обратного вызова, которые отвечают на активность в сокете, и затем продолжаете свой веселый путь. На Mac есть CFSocket, который предоставляет такую функциональность. Он порождает свой собственный поток и управляет соединением сокетов, используя select (2).
Этот - хороший небольшой пост, рассказывающий о CFSocket.
CFSocket хорошо вписывается в идиому Mac для передачи сообщений и обработки событий, и, вероятно, именно на это следует обратить внимание при выполнении такого рода работы. Существует также оболочка класса Obj-C, построенная на CFSocket, которая называется ULNetSocket (ранее NetSocket).