在NSURLSession中,当我的文件下载时,我会跟踪进度:
CGFloat progress = (CGFloat)totalBytesWritten / (CGFloat)totalBytesExpectedToWrite;
更新屏幕指示。我需要确保一旦下载完成,但指示消失,就像在我的情况下我显示正在下载的图像。
if (progress == 1.0) { ... }
可以作为支票吗?这可能看起来很愚蠢,但我想确保没有边缘情况我没有考虑,因为过去我已经被编程奇怪的划分结果,可能会返回1.000000
或{{1或某事,或甚至可以做1.0000001828111
之类的事情?
答案 0 :(得分:3)
假设:
CGFloat progress = (CGFloat)totalBytesWritten / (CGFloat)totalBytesExpectedToWrite;
如果progress == 1.0
为真,则假设(CGFloat)totalBytesWritten == (CGFloat)totalBytesExpectedToWrite
是完全合理的。如果totalBytesWritten == totalBytesExpectedToWrite
假设编译器符合标准,那么这应该是正确的,但这可能是一个不好的假设。有些方法编译器可以通过错误地处理过多的精度来解决这个问题,但我不认为它们适用于您的目标系统。尽管如此,对Arkku答案的更新(“编辑”)是一个好主意:当您计算进度时,如果1.0
为真,只需将其强制为totalBytesWritten == totalBytesExpectedToWrite
。
答案 1 :(得分:2)
使用浮点除法的结果进行安全检查将类似于:
if (progress > (1.0f - FLT_EPSILON))
但是,假设字节数是整数,您只需检查:
if (totalBytesWritten == totalBytesExpectedToWrite)
编辑:如果根据评论,您无法将整数传递到您需要执行此检查的任何位置,您还可以确保progress
等于1.0f
in那种情况:
progress = (written < expected) ? ((CGFloat)written / expected) : 1.0f;