Завершение задачи iOS 4.0 в фоновом режиме - PullRequest
2 голосов
/ 04 августа 2010

В 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....");
});
}

Что мне нужно сделать, чтобы завершить загрузку асинхронно в фоновом режиме, когда приложение переходит в фоновый режим?

1 Ответ

0 голосов
/ 01 сентября 2011

Я думаю, это потому, что вы заканчиваете фоновое задание до того, как загрузка фактически закончится. Вы должны поместить вызов [application endBackgroundTask:self->bgTask]; в метод NSURLConnectionDelegate, когда загрузка завершится (как успешно, так и неудачно), а не только после вызова [self.connection start]

...