2012-09-04 49 views
5

我正在製作一個應用程序,其中我想提供的功能之一是測量連接的下載速度。爲了得到這個我使用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

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

您可以使用從NSURLConnectionDownloadDelegate這種方法服務器? –

+0

我在我的城市使用大學服務器。 – pedros

+1

速度測試有許多具有瘋狂快速互聯網連接的服務器(要求爲100 Mb/s +)。因此,如果有人位於不同的國家並使用您的應用,則他們的距離會導致數據傳輸時間延長,因此應用會報告不準確的速度。另外,如果一羣人一次做了這些(不確定你的服務器的速度),服務器可能會放慢速度,導致數據傳輸時間更長。我會建議在Google上找到一個文件並下載它。 Google在不同地點擁有不少數據中心。 –

回答

1

只要您開始下載,捕獲當前系統時間並將其存儲爲startTime。然後,您需要做的就是在下載過程中的任何時刻計算數據傳輸速度。只需再次查看系統時間並將其用作currentTime即可計算迄今爲止所花費的總時間。

downloadSpeed = bytesTransferred /(currentTime的 - 開始時間)

像這樣:你用你自己的

- (void)connectionDidResumeDownloading:(NSURLConnection *)connection totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long) expectedTotalBytes; 
+0

嘿 - 我怎樣才能得到這個值是Mbps? –

+3

@AsiGivati:只需將'downloadSpeed'除以2^20即可!你會得到MBps – Nishant