2012-09-04 12 views
5

Im fare un'app in cui una delle funzionalità che voglio offrire è misurare la velocità di download della connessione. Per ottenere questo utilizzo NSURLConnection per avviare il download di un file di grandi dimensioni, e dopo un po 'di tempo annullare il download ed effettuare il calcolo (Dati scaricati/tempo trascorso). Mentre altre app come speedtest.net danno sempre una velocità costante, la mia fluttua di 2-3 Mbps in più o in meno.Il modo migliore per misurare la velocità di download su iPhone utilizzando il cacao touch

Fondamentalmente quello che sto facendo è, avviare il timer quando la connessione del metodo: didReceiveResponse: viene chiamata. Dopo 500 chiamata del metodo di connessione: didReceiveData: Annullo il download, interrompi il timer e calcola la velocità.

Ecco il codice:

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

Vorrei sapere se c'è un modo migliore di fare questo. Un algoritmo migliore o una classe migliore da usare.

Grazie.

+0

Si sta utilizzando il proprio server? –

+0

Sto usando un server universitario nella mia città. – pedros

+1

Speed ​​Test ha molti server che hanno connessioni Internet follemente veloci (richieste per essere 100 Mb/s +). Pertanto, se qualcuno si trova in un paese diverso e utilizza la tua app, la distanza richiederà più tempo per il trasferimento dei dati, pertanto l'app segnalerà una velocità imprecisa. Inoltre, se un gruppo di persone lo sta eseguendo contemporaneamente (non è sicuro della velocità del server), il server potrebbe rallentare causando il trasferimento dei dati più lungo. Consiglierei di trovare un file su Google e di scaricarlo. Google ha diversi data center in diverse posizioni. –

risposta

1

Non appena si avvia il download, acquisire l'ora di sistema corrente e memorizzarla come startTime. Quindi, tutto ciò che devi fare è calcolare la velocità di trasferimento dei dati in qualsiasi momento durante il download. Guarda nuovamente l'ora del sistema e usalo come currentTime per calcolare il tempo totale trascorso finora.

downloadSpeed ​​= bytesTransferred/(currentTime - startTime)

Ti piace questa:

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

È possibile utilizzare questo metodo da NSURLConnectionDownloadDelegate:

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

Hey - Come posso ottenere questo valore in Mbps? –

+3

@AsiGivati: basta dividere "downloadSpeed" di 2^20! Riceverai MBps – Nishant

Problemi correlati