使用 cocoa touch 测量 iPhone 上下载速度的最佳方法

2024-02-06

我正在制作一个应用程序,我想提供的功能之一是测量连接的下载速度。为了得到这个,我使用 NSURLConnection 开始下载一个大文件,并在一段时间后取消下载并进行计算(下载的数据/经过的时间)。 虽然其他应用程序(例如 speedtest.net)每次都提供恒定的速度,但我的应用程序或多或少波动 2-3 Mbps。

基本上我正在做的是,在调用方法connection:didReceiveResponse:时启动计时器。在调用方法 connect:didReceiveData: 500 次后,我取消下载,停止计时器并计算速度。

这是代码:

- (IBAction)startSpeedTest:(id)sender 
{
    limit = 0;
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:self.selectedServer  cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60];

    NSURLConnection *testConnection = [NSURLConnection connectionWithRequest:testRequest delegate:self];
    if(testConnection) {
        self.downloadData = [[NSMutableData alloc] init];
    } else {
        NSLog(@"Failled to connect");
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    self.startTime = [NSDate date];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.downloadData appendData:data];
    if (limit++ == 500) {
        [self.connection cancel];
        NSDate *stop = [NSDate date];
        [self calculateSpeedWithTime:[stop timeIntervalSinceDate:self.startTime]];
        self.connection = nil;
        self.downloadData = nil;
    }
}

我想知道是否有更好的方法来做到这一点。更好的算法,或者更好的类来使用。

Thanks.


一旦开始下载,捕获当前系统时间并将其存储为startTime。然后,您需要做的就是计算下载过程中任意时刻的数据传输速度。只需再次查看系统时间并将其用作currentTime计算到目前为止花费的总时间。

下载速度 = bytesTransferred / (当前时间 - 开始时间)

像这样:

static NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate];    
NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate];
double downloadSpeed = totalBytesWritten / (currentTime - startTime);

您可以使用此方法NSURLConnectionDownloadDelegate:

- (void)connectionDidResumeDownloading:(NSURLConnection *)connection totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long) expectedTotalBytes;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 cocoa touch 测量 iPhone 上下载速度的最佳方法 的相关文章

随机推荐

  • 建议像 google 一样使用 postgresql trigrams 和全文搜索

    我想做一个文本搜索 我在用着PostgreSQL http www postgresql org 因为神奇的Postgis http postgis refractions net 我正在考虑使用FTS http www postgresq
  • Aarch64 上 C++11 原子的部分重新排序

    我正在看gcc 的 rmw 原子的编译器输出 https goo gl ZWLeCJ并注意到一些奇怪的事情 在 Aarch64 上 诸如 fetch add 之类的 rmw 操作可以通过宽松的负载进行部分重新排序 在 Aarch64 上 可
  • 获取磁盘上文件的所有者

    下面是我当前的宏 它运行得很好 但我想在 Cells r 10 中添加文件的所有者 这样的事情怎么可能完成呢 我找不到像 File Owner 之类的命令 Sub DoFolder Folder If Ans vbNo Then GoTo
  • Elasticsearch - 匹配字符串或空值

    我必须检查某个字段是否与特定文本匹配或为空 可以这样做吗 谢谢 您可以通过使用来实现这一点missing http www elasticsearch org guide en elasticsearch reference current
  • TypeScript 接口数组类型错误 TS2411

    我很难理解这一点 支持的索引类型有两种 字符串和数字 可以支持两种类型的索引 但限制是从数字索引返回的类型必须是从字符串索引返回的类型的子类型 虽然索引签名是描述数组和 字典 模式的强大方法 但它们还强制所有属性与其返回类型相匹配 在此示例
  • Android WebRTC 中的本地视频渲染器

    我正在使用这个库 https bintray com google webrtc google webrtc https bintray com google webrtc google webrtc 我想要实现的目标 至少在我的项目开始时
  • 共享库如何知道它所在的位置?

    我正在为 Linux 机器开发一个共享库 它是通过 rpath 相对于主可执行文件动态加载的 现在 库本身尝试相对于其位置动态加载其他库 但没有 rpath 我使用 scandir 来搜索某个文件夹中的共享库 我还不知道它们的名称 仅当工作
  • 正则表达式匹配不包含任何超过 10 个字符的单词的字符串?

    S 10 我有一个正则表达式 它将匹配任何包含 10 个字符的单词的字符串 然而我需要它的反面 一个正则表达式 仅匹配不包含 gt 10 个字符的单词的字符串 使用否定断言 S 10 S 10 匹配 10 的序列 S 它必须是更长的子序列
  • Spring:如何将属性文件中的值传递给构造函数

    我有一个MongoService类为 public class MongoService private final Mongo mongo private final String database private static fina
  • 我想在 SwiftUI 中的 TextField 添加 $ 符号

    Hi I want to add sign to a TextField when a user is typing 这是我当前的代码 ZStack alignment leading if price isEmpty Text Enter
  • fftw c2c:转换后的真实数据中缺少对称性

    最近我遇到了一些关于fftw的使用及其c2c转换的问题 参见 3d c2c fft 与 fftw 库 https stackoverflow com questions 10374656 3d c2c fft with fftw libra
  • 特征向量变换的差异:Mathematica 与 SciPy

    类似的问题之前曾在这里被问过 但似乎没有人回答我的例子 我使用 Mathematica 和 SciPy 计算矩阵 A 的特征值和特征向量 特征值一致 但特征向量则不然 1 最低 特征值 特征向量一致 2 Mathematica 和 SciP
  • Python3解析xml

    我尝试使用不同的 python3 模块和互联网上的不同文章来解析 XML 但没有成功 我有这个 XML
  • bootstrap 3 - 如何将品牌放置在导航栏的中心?

    我正在使用 Bootstrap 3 我想要一个仅包含品牌的导航栏 没有其他链接或任何其他内容 我希望品牌位于中心 我怎样才能做到这一点 以下 CSS 不起作用 navbar brand text align center css navba
  • Firebase 运行循环中未捕获的异常 (3.0.0)

    我正在使用最新的 firebase 9 0 2 build gradle dependencies compile com google firebase firebase database 9 0 2 compile com google
  • opencv中的错误 - python3 (detectMultiScale) 人脸识别

    我正在尝试创建一个人脸检测程序 当我执行以下代码时 import numpy as np import cv2 face cascade cv2 CascadeClassifier Practica Proyectos Practica O
  • 甜甜圈缓存 ASP.NET MVC2

    是否有可能使用 MVC2 进行甜甜圈缓存 即使进行了大量研究 我也无法找到可行的解决方案 甜甜圈缓存不适用于 ASP NET MVC 2 请参阅http forums asp net t 1521502 aspx http forums a
  • MongoDB-转义点 '.'在地图键中]

    产品的地图键代码包含点 但未配置替换 首先确保地图键不包含点或配置适当的替换 org springframework data mapping model MappingException 地图键 foo bar key 包含点 但未配置替
  • 无法运行 aapt dump badging - Google Play 商店

    我无法将我的应用程序上传到 Play 商店 当我上传 file apk 时 收到此错误 无法运行 aapt dump badging W ResourceType 17873 错误的 XML 块 标头大小 28024 或总大小 170224
  • 使用 cocoa touch 测量 iPhone 上下载速度的最佳方法

    我正在制作一个应用程序 我想提供的功能之一是测量连接的下载速度 为了得到这个 我使用 NSURLConnection 开始下载一个大文件 并在一段时间后取消下载并进行计算 下载的数据 经过的时间 虽然其他应用程序 例如 speedtest