Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 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];
}