Objective-C中countOfBytesReceived/期望值为何仅返回0.000000或1.000000?
问题根源:整数除法的截断特性
你遇到的问题核心是整数类型的除法会直接舍弃小数部分!如果countOfBytesReceived和countOfBytesExpectedToReceive都是整数类型(比如NSInteger、int),那么它们的除法运算只会返回整数结果:
- 当
received < expected时,结果被截断为0,所以输出0.000000 - 当
received >= expected时,结果被截断为1,所以输出1.000000
解决方案:强制触发浮点除法
只需要把其中一个整数转换为浮点数,让运算变成浮点除法,就能得到正确的小数进度值。同时记得先判断除数不为0,避免崩溃:
// 假设你的两个计数是NSInteger类型 NSInteger received = countOfBytesReceived; NSInteger expected = countOfBytesExpectedToReceive; CGFloat progressRatio = 0.0; if (expected > 0) { // 防止除以0的崩溃情况 // 把received转成CGFloat,触发浮点除法 progressRatio = (CGFloat)received / expected; } NSLog(@"Progress: %.6f", progressRatio);
额外优化建议
- 降低定时器频率:每0.01秒执行一次太频繁了,网络数据的更新速度根本达不到这个频率,反而会浪费CPU资源。建议改成每0.1秒执行一次,完全能满足进度更新的需求。
- 改用原生进度回调:如果你是用
NSURLSession或者旧的NSURLConnection做网络请求,其实它们自带了进度回调方法(比如NSURLSessionDownloadTask的URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:代理方法),比定时器轮询更高效、准确,不需要自己手动维护计数和轮询。
内容的提问来源于stack exchange,提问作者user979331
相关产品推荐
相关产品推荐

