5

私が提供したい機能の1つが接続のダウンロード速度を測定することであるアプリを作成しています。これを取得するために、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 に答える