Несколько вещей здесь. Во-первых, почему это происходит каждую секунду, а не только при смене песни? Это будет очень дорого для батареи iPhone, чтобы постоянно болтать таким образом. Нет особых причин делать это даже на рабочем столе.
Так что, если я правильно понимаю, iPhone подключается к .NET и запрашивает песню. .NET возвращает песню и оставляет сокет открытым. Каждую секунду .NET пишет в свой сокет, а каждый второй iPhone читает из своего сокета.
Что я подозреваю, так это то, что в какой-то момент тайм-аут на readDataWithTimeout:tag:
не истекает до следующего запуска NSTimer (ни у одной нет реальной гарантии того, когда он сработает). Тогда вы, вероятно, получите два readDataWithTimeout:tag:
вызова одновременно, возможно, запутав делегата сокета.
Лучшее решение - "длинный опрос". На стороне iPhone звоните readDataWithTimeout:tag:
с довольно длительным тайм-аутом (скажем, 30-60 с). Каждый раз, когда он возвращается, просто возвращайтесь обратно к нему:
while (self.isRunning) {
[socket readDataWithTimeout:60 tag:0];
}
Затем в -onSocketDidDisconnect:
и -onSocket:willDisconnectWithError:
убедитесь, что для self.isRunning
установлено значение NO
. Избавьтесь от NSTimer полностью.
Я все равно не буду публиковать что-либо со стороны .NET, пока Winamp не изменит песни. Повторная отправка одних и тех же данных не дает никаких преимуществ.