2

使用 iOS 4.0 我试图在应用程序暂停时在后台下载图像。我正在做的是当我收到applicationDidEnterBackground委托调用时,我启动了一个异步NSURLConnection并将应用程序委托设置为连接的委托。但是没有一个NSURLConnection代表被召回。我已经使用 Wireshark 捕获了网络调用,我可以看到我的请求成功并且也得到了响应。但是由于没有调用任何委托方法,我无法对数据做任何事情。

- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"Application entered background state.");
// UIBackgroundTaskIdentifier bgTask is instance variable
NSAssert(self->bgTask == UIBackgroundTaskInvalid, nil);

bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
    dispatch_async(dispatch_get_main_queue(), ^{
        [application endBackgroundTask:self->bgTask];
        self->bgTask = UIBackgroundTaskInvalid;
    });
}];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://animal.discovery.com/mammals/leopard/pictures/leopard-picture.jpg"] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];
self.connection = [[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO] autorelease];
[self.connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[self.connection start];
[request release];
NSLog(@"Sent download request....");
dispatch_async(dispatch_get_main_queue(), ^{
    while([application backgroundTimeRemaining] > 1.0) {
        //Do something..
    }
    [application endBackgroundTask:self->bgTask];
    self->bgTask = UIBackgroundTaskInvalid;
    NSLog(@"Ending background task....");
});
}

当应用程序进入后台时,我应该怎么做才能在后台异步完成下载?

4

1 回答 1

0

我认为这是因为您在下载实际完成之前结束了后台任务。您应该[application endBackgroundTask:self->bgTask];在下载完成时(成功和不成功)调用 NSURLConnectionDelegate 方法,而不是仅仅在调用之后[self.connection start]

于 2011-09-01T13:08:13.597 回答