0

Web サイトからダウンロードするコードを作成し、ダウンロードのスループットを 3 秒ごとにバイト/秒で計算する必要があります。これどうやってするの?Web サイトをダウンロードしたとしますが、バイトを格納するある種の可変配列に格納し、3 秒ごとにその長さを 3 で割る必要があります。スループットを知るのに役立つどのタイマーを使用できますか?

また、データはバイト単位で格納する必要があるため、どの配列タイプを使用できますか?

4

2 に答える 2

2

については、URL ローディング システム プログラミング ガイドを参照してNSURLConnectionください。「スループット」の単純な定義だけを計算したい場合は、実際に受信したバイト数を保存する必要はありませんが、保存することはNSURLConnectionできます。受信したバイト数を数えるだけです。

ファイルの受信にかかる時間を測定するには、 を[NSDate timeIntervalSinceReferenceDate]開始する直前 (または直後) に呼び出しますNSURLConnection。接続が完了したら、もう一度呼び出します。減算します。違いは、秒単位のダウンロード時間です。

については、タイマー プログラミングのトピックを参照してくださいNSTimer。1 を使用して、3 秒が経過したことを通知します。

于 2013-04-02T04:55:15.040 に答える
1

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 が最終的なスループットになります。

于 2013-04-02T05:06:57.097 に答える