NSURLConnection 不会永远保持连接;它有一个超时,如果在该超时内没有收到数据,它会再次关闭连接。
didReceiveData 仅在实际有可用数据时调用 - 如果您发送请求并且由于当前没有可用数据而没有从服务器返回任何内容,则预计不会调用它,不是吗?
是否调用了 connectionDidFinishLoading 方法?如果它被调用,我猜 NSURLConnection 正在等待数据一段时间并且没有数据到达,它停止了 - 因为一旦 NSURLConnection 完成,这个方法应该总是被调用,无论它是否成功。
NSURLConnection 基于 NSURLRequest,当创建 NSURLRequest 时,您可以手动设置超时。尝试设置一个非常大的超时。超时以秒为单位(允许秒的小数部分,它是一个浮点数),因此尝试将 28800.0 设置为超时,即 8 小时,看看连接现在是否保持打开足够长的时间以便调用 didReciveData。
另请注意,NSURLConnection 不知道数据从哪里开始以及数据在哪里结束,因此它可能会多次调用 didReceiveData 来发送一条数据,并且您的应用程序需要自行重新组装接收到的数据,并且它必须知道这是否是一个完整的数据块,准备好处理,或者它必须等待更多数据进入另一个 didReceiveData 回调。
更新
NSURLConnection 不保证在数据到达后立即传递数据。如果它接收到一些数据并且它仍然有空间缓存更多数据,它将继续等待更多数据并将数据聚合成一个块,最后一次交付整个块。这就是为什么您的倒数计时器不起作用的原因。它确实提供了所有倒计时数据,但它在倒计时结束后才这样做,因为所有小的倒计时更新都完全适合单个块,并且 HTTP 标头的 MIME 类型进一步表明许多小块正在跟随。为了避免调用你的方法委托的次数过多,NSURLConnection 会在内部缓存回复内容,只要它还有空间这样做。
我不确定你是否可以用 NSURLConnection 做你想做的事情。我个人宁愿为此使用真正的套接字连接——但我不知道这在 iPhone 上是否可行。
如果对您有任何安慰,您在此处发布的 URL 在 Firefox 中运行良好,但在 Safari 4 中不起作用(Safari 4 仅在末尾显示图像,而不是倒计时)。因此,您在此处获得的行为与您在 Safari 中获得的行为相同。