Как соединение может начаться с NSURLConnection, в то время как на переднем плане может быть продолжено в фоновом режиме?

Я искал буквально недели, чтобы попытаться найти ответ или пример того, как это сделать.

Все примеры / учебные пособия для NSURLConnection показывают, что он начинается на переднем плане или начинается в фоновом режиме, так же как и все примеры для beginBackgrounTaskWithExpirationHandler: показать, как запустить фоновую задачу после ввода фона.

Насколько я могу судить, в Интернете или книгах нет ничего, что показывало бы, как установить соединение, находясь на переднем плане, а затем, если оно не завершено, продолжить его в фоновом режиме.

Ответ на этот вопрос на самом деле не отвечает на вопрос:

Как должен начинаться задний план с обработчиком вдоха: иметь дело с NSUrlConnection, который уже выполняется?

Если вы читаете раздел Beyond The Basics, на который ссылаются, он говорит: "Пока приложение находится на переднем плане, фоновая задача не будет иметь никакого эффекта". Это означает, что невозможно запустить фоновую задачу, используя NSURLConnection, в то время как на переднем плане, если вы хотите загрузить на переднем плане.

1 ответ

Решение

Вы просто звоните beginBackgroundTaskWithExpirationHandler: в то время как ваше приложение находится на переднем плане прямо при запуске процесса загрузки. Обратите внимание, что вы должны сохранить возвращаемое значение в свойстве ivar /:

@property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskID;

@synthesize backgroundTaskID;

...

NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
self.backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    // Cancel the connection
    [connection cancel];
}];

Это позволит вашему приложению продолжить работу, если оно будет отправлено в фоновый режим во время загрузки. Затем в ваших методах делегата, которые обозначают завершение загрузки, вы должны поместить соответствующие endBackgroundTask::

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    // Handle the error
    ...

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // Save the downloaded data
    ...

    [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskID];
}
Другие вопросы по тегам