5

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

基本上我正在做的是,在调用方法 connection:didReceiveResponse: 时启动计时器。方法connection: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;
    }
}

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

谢谢。

4

1 回答 1

2

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

downloadSpeed = bytesTransferred / (currentTime - startTime)

像这样:

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;
于 2015-09-14T07:36:05.180 回答