Web サイトからダウンロードするコードを作成し、ダウンロードのスループットを 3 秒ごとにバイト/秒で計算する必要があります。これどうやってするの?Web サイトをダウンロードしたとしますが、バイトを格納するある種の可変配列に格納し、3 秒ごとにその長さを 3 で割る必要があります。スループットを知るのに役立つどのタイマーを使用できますか?
また、データはバイト単位で格納する必要があるため、どの配列タイプを使用できますか?
Web サイトからダウンロードするコードを作成し、ダウンロードのスループットを 3 秒ごとにバイト/秒で計算する必要があります。これどうやってするの?Web サイトをダウンロードしたとしますが、バイトを格納するある種の可変配列に格納し、3 秒ごとにその長さを 3 で割る必要があります。スループットを知るのに役立つどのタイマーを使用できますか?
また、データはバイト単位で格納する必要があるため、どの配列タイプを使用できますか?
については、URL ローディング システム プログラミング ガイドを参照してNSURLConnection
ください。「スループット」の単純な定義だけを計算したい場合は、実際に受信したバイト数を保存する必要はありませんが、保存することはNSURLConnection
できます。受信したバイト数を数えるだけです。
ファイルの受信にかかる時間を測定するには、 を[NSDate timeIntervalSinceReferenceDate]
開始する直前 (または直後) に呼び出しますNSURLConnection
。接続が完了したら、もう一度呼び出します。減算します。違いは、秒単位のダウンロード時間です。
については、タイマー プログラミングのトピックを参照してくださいNSTimer
。1 を使用して、3 秒が経過したことを通知します。
NSURLConnectionを読んでください。そのdelegateを実装すると、データが受信されるとコールバックされます。NSURLConnection は、リクエストを 1 回で行う方法を提供しますが、この方法では部分的な結果をユーザーに提示できます。
状態を保持する 3 つのプロパティを作成します。
@property(nonatomic, strong) NSDate *start;
@property(nonatomic, assign) NSInteger bytesSoFar;
@property(nonatomic, assign) float throughputSoFar;
- (void)start {
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/"]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
self.start = [NSDate date];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSDate *now = [NSDate date];
self.bytesSoFar += [data length];
self.throughputSoFar = self.bytesSoFar / [now timeIntervalSinceDate:self.start];
// update the UI with progress
}
connectionDidFinishLoading を取得すると、self.throughputSoFar が最終的なスループットになります。