我在我的一个视图控制器中使用ASIProgressDelegate来计算下载文件的剩余时间。我通过采用指数平均值计算平均带宽,我需要计算每两个didReceiveBytes回调之间的速度(每秒字节数)。 我在每两个didReceiveBytes回调之间维护一个NSTimerInterval,并将此间隔(以秒为单位)接收的“字节”除以获得bytesPerSecond。
bytesPerSecond=(bytes/interval);
一切正常但是当我切换到另一个viewController(需要几秒钟才能加载)时,didReceiveBytes回调也会在特定的时间内暂停(导致间隔增加)。 问题在此之后开始。 根据didReceiveBytes回调暂停的时间,许多didReceiveBytes回调会在0.00XX秒等时间间隔内一个接一个地触发。这会导致bytesPerSecond增加1000的倍数(在我的情况下),导致averageSpeed不正确。
尽管在这些排队的几个(在我的情况下为〜<10)之后,触发了didReceiveBytes回调,但正常行为会以0.XX的间隔恢复。 但损坏已经完成,因为averageSpeed花费了太多时间来反映正确的值(大多数情况下不是在文件下载完成之前)。
这是调试器输出以供参考:
LBPS : 70961.2 for 17524 bytes interval:=0.246952 seconds
//-----This is where the switching of viewControllers and hence a pause
//on didReceiveBytes callbacks takes place. Some another http requests
//might be fired to load the destination viewController hence causing the
//pause----//
LBPS : 731.3 for 20220 bytes interval:=27.648044 seconds
LBPS : 30752210.0 for 16176 bytes interval:=0.000526 seconds
LBPS : 22501136.0 for 14828 bytes interval:=0.000659 seconds
LBPS : 7521728.0 for 18872 bytes interval:=0.002509 seconds
//----After several queued up callbacks normal realtime callbacks start//----
LBPS : 64764.6 for 16176 bytes interval:=0.249766 seconds
LBPS : 75252.0 for 18872 bytes interval:=0.250784 seconds
//LBPS:=LastBytesPerSecond
ASIProgressDelegate的行为是否正常?或者我错过了什么?无论如何我能处理这种歧义吗?