私が提供したい機能の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;
}
}
これを行うためのより良い方法があるかどうかを知りたいです。より良いアルゴリズム、または使用するより良いクラス。
ありがとう。