iphone - iOS - 多个 NSURLConnection 下载

标签 iphone objective-c ios xcode cocoa-touch

我正在尝试使用 NSURLConnection 下载一些文件:

- (void)startDownload {
  NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
  [req addValue:@"Basic XXXXXXXXXXXXXX=" forHTTPHeaderField:@"Authorization"];
  connection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse*)response {
  filepath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:save_name];
  [[NSFileManager defaultManager] createFileAtPath:filepath contents:nil attributes:nil];
  file = [[NSFileHandle fileHandleForUpdatingAtPath:filepath] retain];
  [file seekToEndOfFile];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
  [file seekToEndOfFile];
  [file writeData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
  [file closeFile];
 }

我的文件很大,所以我必须将下载的每一 block 都保存到磁盘上,不能将它们存储在 RAM 中。问题是,我如何处理多个下载?

我想在 - (void)connectionDidFinishLoading: 完成上一个下载后开始下一个下载,但我想这不是最好的方法。有什么建议么?

最佳答案

如果您想使用 NSURLConnection,我建议您制作自己的下载对象来包装连接并处理将其写入磁盘。

您将使用文件名初始化对象以放入完成的文件,并使用 URL 来获取文件,例如:

MyDownloadObject *o = [[MyDownloadObject alloc] initWithFilename:filename URL:url];
o.delegate = self;

每个下载对象都将处理它自己的 NSURLRequest 和 NSURLConnection,使用与您的问题几乎相同的代码:)

完成后,它会告诉您的 View Controller 它已下载(可能通过委托(delegate)方法,但通知也可以工作)。然后,您可以从委托(delegate)方法中得知哪个文件已完成。
- (void)myDownloadObjectFinishedDownload:(MyDownloadObject *)o {
    NSLog(@"File from %@ has been stored at %@", o.URL, o.filename);
}

如果您将 MyDownloadObject 设为 NSOperation 的子类,那么您可以使用 NSOperationQueue 来限制并发下载并监控整体进度等。

如果您不介意使用第三方库,那么 ASIHTTPRequest 是一个不错的选择,但请注意,它不再被开发。我怀疑堆栈溢出的其他人会推荐您可以使用的更好、更新的库。

关于iphone - iOS - 多个 NSURLConnection 下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12895766/

相关文章:

php - 在 PHP 中从 ipa 中提取嵌入式配置文件

ios - iOS-在“NSArray”类型的对象上找不到属性“名称”

ios - 是否有适用于 ios 的良好 CSV 解析器?

iphone - 开源 YouTube 风格的 UITableViewController

ios - 我如何转换回 SpriteKit 中的 GameScene?

iphone - 如何在 Iphone 上嵌入无法启动外部播放器的 youtube 视频?

iphone - 蓝牙警告 Xcode?

ios - 尝试构建时出现奇怪的错误

ios - 有什么方法可以从 Storyboard 中实例化原型(prototype) UITableViewCell 进行测试吗?

ios - Swift 3.0 字符串问题