You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
额外优化建议
  1. 降低定时器频率:每0.01秒执行一次太频繁了,网络数据的更新速度根本达不到这个频率,反而会浪费CPU资源。建议改成每0.1秒执行一次,完全能满足进度更新的需求。
  2. 改用原生进度回调:如果你是用NSURLSession或者旧的NSURLConnection做网络请求,其实它们自带了进度回调方法(比如NSURLSessionDownloadTask的URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:代理方法),比定时器轮询更高效、准确,不需要自己手动维护计数和轮询。

内容的提问来源于stack exchange,提问作者user979331

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:57:56