2012-09-04 15 views
5

Tworzę aplikację, w której jedną z funkcji, które chcę zaoferować, jest pomiar prędkości pobierania połączenia. Aby to uzyskać, korzystam z NSURLConnection, aby rozpocząć pobieranie dużego pliku, a po pewnym czasie anulować pobieranie i wykonać obliczenia (pobrane dane/czas, który upłynął). Podczas gdy inne aplikacje, takie jak speedtest.net, zapewniają stałą prędkość za każdym razem, moje wahają się 2-3 Mb/s mniej lub więcej.Najlepszy sposób pomiaru prędkości pobierania na iPhonie za pomocą kakao touch

Zasadniczo, co robię jest, uruchom zegar, gdy połączenie metody: didReceiveResponse: jest wywoływana. Po 500 wywołaniu połączenia metody: didReceiveData: anuluję pobieranie, zatrzymam licznik czasu i obliczam prędkość.

Oto kod:

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

chciałbym wiedzieć, czy istnieje lepszy sposób to zrobić. Lepszy algorytm lub lepsza klasa do użycia.

Dzięki.

+0

Używasz własnych serwer? –

+0

Korzystam z serwera uniwersyteckiego w moim mieście. – pedros

+1

Speed ​​Test ma wiele serwerów, które mają niesamowicie szybkie połączenia z Internetem (wymagane jest 100 Mb/s +). Jeśli więc ktoś znajduje się w innym kraju i używa aplikacji, ich odległość spowoduje przeniesienie danych na dłużej, dlatego aplikacja zgłosi niedokładną szybkość. Ponadto, jeśli kilka osób robi to od razu (nie będąc pewnym szybkości serwera), serwer może zwolnić, co również spowoduje transfer danych. Polecam znalezienie pliku w Google i pobrać go. Google ma sporo centrów danych w różnych lokalizacjach. –

Odpowiedz

1

Zaraz po rozpoczęciu pobierania przechwyć bieżący czas systemowy i zapisz go jako startTime. Następnie wszystko, co musisz zrobić, to obliczyć szybkość transferu danych w dowolnym momencie podczas pobierania. Po prostu spójrz na czas systemowy i użyj go jako currentTime, aby obliczyć całkowity czas, jaki do tej pory spędziłeś.

downloadSpeed ​​= bytesTransferred/(currentTime - startTime)

Jak to:

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

Można użyć tej metody z NSURLConnectionDownloadDelegate:

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

Hey - Jak mogę uzyskać ta wartość w Mb/s? –

+3

@AsiGivati: Po prostu podziel "downloadSpeed" przez 2^20! Otrzymasz MBps – Nishant

Powiązane problemy