0

AFNetworking で開始された後、リクエストの URL を更新する簡単な方法はありますか? 私のアプリが 2GB のチャンクをダウンロードしているとしましょう。それぞれ 10MB のチャンクが 200 個あります。それぞれについて、AFHTTPRequestOperation を作成し、それをキューに追加します。

問題は、ダウンロード元のサーバーがすべての URL でタイムアウトになっていることです。つまり、その後 403 が返され、新しい URL を生成する必要があります。時間がなくなる前にそれをする必要があります。

for (DownloadFile *downloadFile in [download filesInTheDownload])
{
    for (DownloadChunk *downloadChunk in [downloadFile chunksInTheFile])
    {
        NSURL *fileURL = [[NSURL alloc] initWithString:[downloadFile filePath]];

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fileURL];
        NSLog(@"Normal range: %lli-%lli", [downloadChunk startingByte], [downloadChunk endingByte]);
        NSString *range = [NSString stringWithFormat:@"bytes=%lli-%lli", newStartingByte, [downloadChunk endingByte]];
        [request setValue:range forHTTPHeaderField:@"Range"];
        AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
        operation.outputStream = [NSOutputStream outputStreamToFileAtPath:chunkPath append:YES];

        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"%@", [NSString stringWithFormat:@"Chunk complete: %@.%i", [downloadFile fileName], [downloadChunk chunkId]]);
            if (download.downloadedBytes == download.size)
                [[NSNotificationCenter defaultCenter] postNotificationName:@"downloadFinished" object:download];
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
        }];

        [operation setDownloadProgressBlock:^(NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
            download.downloadedBytes += bytesRead;
        }];

        [queue addOperation:operation];
    }
}
4

1 に答える 1

0

いいえ、スケジュールされた操作を変更することはできません。通常、これは良いことです。つまり、操作をスケジュールして、元の条件に基づいて実行されることを完全に確認できます。

あなたのケースには2つの選択肢があります。まず、操作を 1 つずつスケジュールし、リンクが有効かどうかを確認し、必要に応じて更新します。

403 Forbidden次に、リンクを更新して同じ操作を再スケジュールすることで対応できます。

于 2012-08-16T12:51:05.630 に答える