2012-08-16 61 views
0

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

问题是,我正在下载的服务器在所有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]; 
    } 
} 

回答

0

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

我看到你的情况有两个选项。首先,您可以逐个安排操作,并验证链接是否有效,并根据需要进行更新。其次,您可以通过更新链接并重新调度相同的操作来对403 Forbidden作出反应。

+0

是的,我在考虑这两种情况,但认为我也可以通过继承AFHTTPNetworking或其他方式来实现;) – Thunder 2012-08-16 12:55:24

+0

当然,但它会带来维护的复杂性;) – Farcaller 2012-08-16 13:29:46