在后台线程中下载多个文件

时间:2011-08-09 13:15:42

标签: objective-c ios multithreading ipad download

我正在制作一个iPad应用程序,您可以在其中下载文件(如PDF,doc等)并离线查看。

我已有视图部分,您可以将文件下载到文档目录。 因为现在你需要等待下载完成才能继续。 这可以通过将它放在一个线程中来解决,但是当用户下载多个文件甚至多次下载同一个文件时会发生什么?

我的想法是创建一个下载队列,并查看进度。

工作流:

  • 用户打开文档并按下载,用户会收到下载已启动的消息,可以在离线文档视图中查看。

  • 用户再下载3个文档。

  • 当用户转到离线文档视图时,用户会看到一个包含4个已填充单元格的表格视图。 2个文档已完成加载,另外2个仍在下载,因为表格视图单元格中显示了下载/状态栏。

  • 可以查看或删除下载的文件。

  • 正在进行的下载无法观看,但可以取消。

我想创建一个线程下载类,您可以在其中添加要下载的URL。该类具有取消和删除文档下载的方法,但也有返回进度的方法。 如果可能,该课程可以同时处理下载。

问题是,我不知道从哪里开始?

2 个答案:

答案 0 :(得分:3)

NSURLConnection已经异步。您需要做的就是创建NSURLConnection个实例,将它们与您的数据结构相关联,并拥有它。

这是一个例子,我假设你每个项目都有一个UIView。如果使用表视图,则不能指望视图实例,而是将下载与NSIndexPath或其他内容相关联。

@implementation MyDownloadView
- (void)startDownload {
    NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
    [req setHTTPMethod:@"GET"];
    // Set headers etc. if you need
    [[[NSURLConnection alloc] initWithRequest:req delegate:self] autorelease];
    [req release];

    self.responseData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Alternatively, store to a file so you don't run out of memory
    [self.responseData appendData:data];
}
@end

然后实现其他NSURLConnection委托方法来执行您需要的操作。

答案 1 :(得分:0)

我编写了一个开源示例,其中包含您想要的所有功能,取消下载目前仅在代码中可用,但为此添加按钮非常简单。

我正在使用asi-http-request来管理下载,它们显示在网格视图(AQGridView)而不是UITableView中,但我认为你明白了。

下载进度通过KVO管理。

首先查看PSPDFDownload.mDownload the full demo here

完全披露:此演示使用PSPDFKit实现更快的pdf显示。但是Kiosk示例正是您所需要的,并且您不需要使用PSPDFKit进行pdf显示。甚至还有一个使用Apple QuickLook的示例代码路径。