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