2012-09-04 16 views
5

私が提供したい機能の1つが、接続のダウンロード速度を測定することです。これを取得するには、NSURLConnectionを使用して大きなファイルのダウンロードを開始し、しばらくしてからダウンロードをキャンセルして計算(データのダウンロード/時間の経過)を行います。 speedtest.netのような他のアプリでは毎回一定の速度が得られますが、私の場合は2〜3 Mbps程度の変動があります。iPhoneでココアタッチを使ってダウンロード速度を測定する最善の方法

基本的には、メソッド接続:didReceiveResponse:が呼び出されたときにタイマーを開始します。メソッド接続の500コール後:didReceiveData:私は、ダウンロードをキャンセルし、タイマーを停止し、速度を計算します。ここで

はコードです:

- (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; 
    } 
} 

私はこれを行うには良い方法があるかどうかを知りたいです。より良いアルゴリズム、またはより良いクラスを使用する。

ありがとうございました。

+0

あなた自身を使用していますサーバ? –

+0

私の街の大学のサーバーを使用しています。 – pedros

+1

スピードテストには、非常に高速なインターネット接続が必要なサーバーが多数あります(100 Mb/s +にする必要があります)。だから誰かが別の国にいて、あなたのアプリを使っているならば、その距離はデータの転送に時間がかかるため、アプリは不正確なスピードを報告します。また、一度にたくさんの人が(サーバーの速度がわからない)サーバーが遅くなると、データの転送に時間がかかることがあります。 Googleでファイルを探してダウンロードすることをおすすめします。 Googleはさまざまな場所にかなりのデータセンターを持っています。 –

答えて

1

ダウンロードを開始するとすぐに、現在のシステム時刻を取得し、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; 
+0

あなたの要件を満たしますこの値はMbpsですか? –

+3

@AsiGivati: 'downloadSpeed'を2^20で割ります!あなたはMBpsを取得します – Nishant

関連する問題