gpt4 book ai didi

ios - 一个 NSURLSession 中所有 NSURLSessionTasks 的平均进度

转载 作者:IT王子 更新时间:2023-10-29 08:10:52 25 4
gpt4 key购买 nike

NSURLSession 将允许您向其中添加大量的 NSURLSessionTask 以便在后台下载。

如果你想查看单个NSURLSessionTask的进度,很简单

double taskProgress = (double)task.countOfBytesReceived/(double)task.countOfBytesExpectedToReceive;

但是,检查 NSURLSession 中所有 NSURLSessionTasks平均进度的最佳方法是什么?

我想我会尝试平均所有任务的进度:

[[self backgroundSession] getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *allDownloadTasks) {

double totalProgress = 0.0;

for (NSURLSessionDownloadTask *task in allDownloadTasks) {

double taskProgress = (double)task.countOfBytesReceived / (double)task.countOfBytesExpectedToReceive;

if (task.countOfBytesExpectedToReceive > 0) {
totalProgress = totalProgress + taskProgress;
}
NSLog(@"task %d: %.0f/%.0f - %.2f%%", task.taskIdentifier, (double)task.countOfBytesReceived, (double)task.countOfBytesExpectedToReceive, taskProgress*100);
}

double averageProgress = totalProgress / (double)allDownloadTasks.count;

NSLog(@"total progress: %.2f, average progress: %f", totalProgress, averageProgress);
NSLog(@" ");

}];

但这里的逻辑是错误的:假设您有 50 个任务期望下载 1MB,3 个任务期望下载 100MB。如果 50 个小任务在 3 个大任务之前完成,averageProgress 将比实际平均进度高很多。

因此,您必须根据 TOTAL countOfBytesReceived 除以 TOTAL countOfBytesExpectedToReceive 来计算平均进度。但问题是 NSURLSessionTask 计算这些值只有在它开始时,并且它可能不会开始直到另一个任务完成。

那么如何查看一个NSURLSession所有NSURLSessionTasks的平均进度呢?

最佳答案

啊是的。我记得在 1994 年编写 OmniWeb 时处理过这个问题。我们尝试了很多解决方案,包括让进度条旋转而不是显示进度(不受欢迎),或者随着新任务计算出它们有多大/被添加到队列中(让用户不高兴,因为他们看到有时会出现逆向进展)。

最后,大多数程序(包括 iOS 5 和 Safari 中的 Messages)决定使用的是一种作弊:例如,在 Messages 中,他们知道发送一条消息的平均时间约为 1.5 秒(示例数字仅),因此他们将进度条设置为动画,使其在大约 1.5 秒时完成,如果消息尚未真正发送,则会延迟 1.4 秒。

现代浏览器(如 Safari)改变了这种方法,将任务分成几个部分,并为每个部分显示一个进度条。就像(仅作为示例),Safari 可能认为在 DNS 中查找 URL 通常需要 0.2 秒,因此他们会在 0.2 秒内为进度条的前 1/10(或其他)设置动画,但他们当然会如果 DNS 查找分别花费更短或更长的时间,则向前跳过(或在第 1/10 标记处等待)。

在你的情况下,我不知道你的任务的可预测性如何,但应该有一个类似的作弊。比如,是否有大多数文件的平均大小?如果是这样,您应该能够计算出 50 需要多长时间。或者你只是将你的进度条分成 50 段并在每次文件完成时填充一个段,并根据你获得的当前字节数/秒或基于你获得的文件数/秒来制作动画far 或您喜欢的任何其他指标。

如果您必须开始或停止进度条,一个技巧是使用芝诺悖论——不要只是停止或跳到下一个标记,而是减速(并继续减速)或加速(并继续加速)向上),直到您到达栏需要的位置。

祝你好运!

关于ios - 一个 NSURLSession 中所有 NSURLSessionTasks 的平均进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20702558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com