iOS应用程序背景下载

时间:2011-01-02 18:31:35

标签: iphone download uiapplicationdelegate download-manager

喂!我需要知道如何让我的iOS应用程序在应用程序的后台开始下载(比如,在AppDelegate文件中运行下载),因此更改ViewControllers不会中断或取消下载。我还需要能够获得下载的进度(0.00000 - 1.00000),以设置UIProgressView对象,这也意味着我需要一个- (void)progressDidChangeTo:(int)progress函数。

2 个答案:

答案 0 :(得分:18)

只需使用ASIHTTPRequest它比NSURLRequest更容易,并且完全符合您的需要。 它examples显示了如何在后台下载以及如何报告进度。

我不会直接在AppDelegate中下载任何内容。相反,我会为此目的创建一个单独的类。我们称之为MyService然后我会在我的app delegate中初始化该类。

该类可以作为单例工作,也可以传递给需要它的每个视图控制器。

MyService类中,我会添加ASINetworkQueue和几个方法来处理准备好的请求。以下是您可以使用的ASI示例代码:

- (IBAction)startBackgroundDownloading:(id)sender
{
   if (!self.queue) {
      self.queue = [[[ASINetworkQueue alloc] init] autorelease];
   }

   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setDelegate:self];
   [request setDidFinishSelector:@selector(requestDone:)];
   [request setDidFailSelector:@selector(requestWentWrong:)];
   [self.queue addOperation:request]; //queue is an NSOperationQueue
   [self.queue go];
}

- (void)requestDone:(ASIHTTPRequest *)request
{
   NSString *response = [request responseString];
   //Do something useful with the content of that request.
}

- (void)requestWentWrong:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}

如果您需要设置进度条。我只是在我的MyService类中公开ASINetworkQueue的setDownloadProgressDelegate,并在我的ViewControllers中设置它:

[[MyService service] setDownloadProgressDelegate: self.myUIProgressView];

顺便说一句。如果您需要在应用退出时继续下载,可以将请求的ShouldContinueWhenAppEntersBackground属性设置为YES。

答案 1 :(得分:3)

您可以使用NSURLConnection启动异步请求,该请求不会导致您的UI被冻结。您可以通过执行以下操作来执行此操作:

NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
[urlRequest release];

为了获得进步,您可以使用:

connection:didReceiveResponse:(NSURLResponse *)response;

委托调用来检查response.expectedContentLength,然后使用

connection:didReceiveData:(NSData *)data

跟踪下载的数据量并计算百分比。

希望这有帮助, Moszi