2012-09-04 5 views
5

Teklif vermek istediğim özelliklerden birinin bağlantının indirme hızını ölçmek olduğu bir uygulama yapıyorum. Bunu elde etmek için büyük bir dosyanın indirilmesini başlatmak için NSURLConnection'ı kullanıyorum ve bir süre sonra indirme işlemini iptal edip (indirilen veri/zaman doldu). speedtest.net gibi diğer uygulamalar her seferinde sabit bir hız verirken, benimki de 2-3 Mbps daha fazla veya daha az dalgalanıyor.Kakao kullanarak iPhone'da indirme hızını ölçmenin en iyi yolu

Temel olarak yaptığım şey, yöntem bağlantısı olduğunda zamanlayıcıyı başlattı: didReceiveResponse: çağrıldı. Metot bağlantısının 500 çağrısından sonra: didReceiveData: İndirmeyi iptal ediyorum, zamanlayıcıyı durdurup hızı hesapladım. Bunu yapmanın daha iyi bir yolu olup olmadığını bilmek istiyorum

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

: Burada

kodudur. Daha iyi bir algoritma veya daha iyi bir sınıf.

Teşekkürler.

+0

kendi kullanıyorsunuz sunucu? –

+0

Benim şehrimde bir üniversite sunucusu kullanıyorum. – pedros

+1

Hız Testi, inanılmaz hızlı Internet bağlantılarına (100 Mb/s + olması gerekir) sahip birçok sunucuya sahiptir. Yani, birisi farklı bir ülkede bulunuyorsa ve uygulamanızı kullanırken, bunların uzaklığı verilerin daha uzun sürmesine neden olacaktır ve bu nedenle uygulama yanlış bir hız bildirecektir. Ayrıca, bir grup insan bir kerede yapıyorsa (sunucunun hızından emin değil), sunucunun da veri aktarımının daha uzun sürmesine neden olarak yavaşlayabilir. Google'da bir dosya bulmanızı ve bunu indirmenizi tavsiye ederim. Google'ın farklı konumlarda oldukça az veri merkezi var. –

cevap

1

İndirmeyi başlattığınızda, geçerli sistem saatini yakalayın ve startTime olarak saklayın. Ardından, yapmanız gereken tek şey indirme sırasında herhangi bir noktada veri aktarım hızını hesaplamaktır. Sadece sistem saatine tekrar bakın ve şimdiye kadar harcanan toplam süreyi hesaplamak için currentTime olarak kullanın.

downloadSpeed ​​= bytesTransferred/(CurrentTime - startTime) Bunun gibi

: Sen NSURLConnectionDownloadDelegate bu yöntemi kullanabilirsiniz

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

:

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

Hey Kişisel Gereksinimleri dolduracaktır bu değer Mbps cinsinden mi? –

+3

@AsiGivati: 'downloadSpeed' dosyasını 2^20'ye bölebilirsiniz! MBps alacaksın – Nishant