检查下载进度时,是否检查“progress == 1.0”好吗?或者应该是> =?

时间:2014-02-24 01:49:14

标签: ios objective-c c cocoa-touch division

在NSURLSession中,当我的文件下载时,我会跟踪进度:

CGFloat progress = (CGFloat)totalBytesWritten / (CGFloat)totalBytesExpectedToWrite;

更新屏幕指示。我需要确保一旦下载完成,但指示消失,就像在我的情况下我显示正在下载的图像。

if (progress == 1.0) { ... }可以作为支票吗?这可能看起来很愚蠢,但我想确保没有边缘情况我没有考虑,因为过去我已经被编程奇怪的划分结果,可能会返回1.000000或{{1或某事,或甚至可以做1.0000001828111之类的事情?

2 个答案:

答案 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;