Причина, по которой вы видите эту проблему, заключается в том, что AsyncSocket выполняется асинхронно в цикле выполнения, но когда вы вызываете sleep (), вы блокируете цикл запуска, который пытается выполнить AsyncSocket.
Когда вы вызываете [asyncSocket connectToHost: ...], метод немедленно возвращается и попытка подключения продолжается в фоновом режиме. Метод делегата уведомит вас о том, когда будет установлено соединение. Но код, который завершает настройку соединения (в AsyncSocket), также должен запускаться в цикле выполнения.
Аналогично, когда вы вызываете [asyncSocket writeData: ...], метод сразу возвращается. Код, который отправляет эти данные, планируется запустить в цикле выполнения сокета. Но если вы вызываете sleep (), вы запрещаете выполнение этого кода.