1

ダウンロードするファイルの URL を取得する API があります。NSURLConnectionファイルのダウンロードに使用しています。MP4なのでファイルサイズが少し大きいかもしれません。

コードステップ:

  1. ダウンロードを再開したいバイトインデックスを初期化NSMutableURLRequestして追加します。HttpHeaderField(インターネット接続が失われる可能性があるため、これを行います)。

  2. で初期化NSURLConnectionされNSMutableURLRequestます。

  3. connection:didReceiveData:データ セグメントを受け取り、それをグローバルNSMutableDataオブジェクトに追加するために使用されます。

  4. インターネットの問題が原因でエラー メッセージが生成される可能性があり、これは を使用して処理されconnection:didFailWithError:ます。このハンドラーには、「インターネットに接続していないか、非常に遅いsetText」というメッセージが表示されたダウンロード ステータス ラベルがあります。1 秒間スリープしてから、再びステップ 1 に戻ります。

コード:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self resumeDownload];
}

- (void)resumeDownload
{
    NSURL *url = [NSURL URLWithString:video->videoUrl];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    if (receivedData==nil)
    {
        receivedData = [[NSMutableData alloc] init];
    }
    else
    {
        NSString *range = [NSString stringWithFormat:@"bytes=%i-", receivedData.length];
        [request setValue:range forHTTPHeaderField:@"Range"];
    }

    downloadConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"%@", [response description]);
}

- (void) connection:(NSURLConnection*)connection didFailWithError:(NSError*) error
{
    NSLog(@"Download Fail : %d", [error code]);
    [status setText:@"No internet conectivity or it is very slow."];
    sleep(1);
    [self resumeDownload];
}

- (void) connectionDidFinishLoading:(NSURLConnection*)connection
{
    // save the file
}

- (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) data
{
    if(connection == downloadConnection)
    {
        [receivedData appendData:data];
        [status setText:[NSString stringWithFormat:@"Downloading: %d Bytes.", receivedData.length]];
    }
}

スクリーンショット:

ここに画像の説明を入力 ここに画像の説明を入力

注: インターネットが再接続されると、ダウンロードが自動的に再開されます。

これは問題の適切な解決策ですか?

4

1 に答える 1

1

全体として、あなたは正しい道を進んでいます。
発生するエラーの種類を確認する必要があります。ネットワークがない場合は、再試行する意味がありません。到達可能性テストを使用して、再試行するタイミングを確認する必要があります。
また、応答タイプも確認する必要があります - 4xx / 5xx は、これが失敗であっても接続失敗を返しません。たとえば、502 エラーは、接続が正常に終了したとしても、少し後で試す必要があることを意味します。
スリープの使用は避けたいと思います - あなたはメインスレッドをブロックしています。
performSelector:withObject:afterDelay を使用するか、NSTimer を使用します。
ああ、私には 1 秒が短すぎるように思えます。

于 2012-11-07T13:53:56.437 に答える