Как соединение может начаться с NSURLConnection, в то время как на переднем плане может быть продолжено в фоновом режиме?
Я искал буквально недели, чтобы попытаться найти ответ или пример того, как это сделать.
Все примеры / учебные пособия для NSURLConnection показывают, что он начинается на переднем плане или начинается в фоновом режиме, так же как и все примеры для beginBackgrounTaskWithExpirationHandler: показать, как запустить фоновую задачу после ввода фона.
Насколько я могу судить, в Интернете или книгах нет ничего, что показывало бы, как установить соединение, находясь на переднем плане, а затем, если оно не завершено, продолжить его в фоновом режиме.
Ответ на этот вопрос на самом деле не отвечает на вопрос:
Если вы читаете раздел 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];
}