0

在 AFNetworking 中启动请求后,是否有任何简单的方法可以更新请求的 URL?假设我的应用程序正在下载 2GB 的块,我们将有 200 个块,每个块 10MB。对于每个我创建一个 AFHTTPRequestOperation 并将其添加到队列中。

问题是,我从中下载的服务器在所有 URL 上都有超时,这意味着在那之后我会得到 403,我必须生成一个新的。我需要在时间用完之前完成它。

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

不,不可能修改计划的操作。通常这是一件好事,这意味着您可以安排操作并绝对确定它将根据原始条件执行。

在您的情况下,我看到了两种选择。首先,您可以逐一安排操作,并验证链接是否有效,如果需要则更新链接。

其次,您可以403 Forbidden通过更新链接和重新安排相同的操作来做出反应。

于 2012-08-16T12:51:05.630 回答