2015-07-03 3 views
2

Я хочу попробовать почтовый вызов на моем сервере до его успеха, я бы хотел попробовать каждые 30 секунд.iOS NSURLSession, как повторить попытку в didCompleteWithError

Так я использую NSURLSession моего звонка:

NSURLSessionDownloadTask *task = [self.session downloadTaskWithRequest:request]; 
task.taskDescription = [NSString stringWithFormat:@"Downloading file %@", [path lastPathComponent]]; 
[task resume]; 

Тогда, если ошибка не произойдет (нет сети, например) у меня есть ошибка в:

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 

Мой вопрос, как это сделать тот же вызов через 30 секунд будет ли мое приложение в фоновом режиме?

Я попытался с диспетчерской, NSThread и performSelector, но похоже, что это не работает в фоновом режиме :(

Благодаря

ответ

2

Несколько наблюдений:.

  1. Если вы хотите попробовать еще раз в течение 30 секунд, даже если приложение больше не находится на переднем плане, вы, вероятно, просто захотите попросить ОС на некоторое дополнительное время выполнить задачу с конечной длиной. См. Executing Finite-Length Tasks. Если вы это сделаете, ваш стандартный таймер, dispatch_after, или что когда-либо, должны работать нормально.

    Обратите внимание, что у вас есть только 3 минуты, чтобы выполнить эту фоновое задание. Я знаю, что вы сказали, что будете склонны просто повторять попытку через 30 секунд, но я лично подозреваю, что если у пользователя нет возможности подключения, есть хороший шанс, что у них может не быть возможности подключения в течение следующих нескольких минут.

  2. Кстати, если повторная попытка пока приложение все еще работает, я могу посоветовать не пытаться снова через 30 секунд. Лучше, на мой взгляд, использовать Reachability, чтобы вы получили уведомление, когда сеть станет доступной. Нет смысла повторять попытку, пока сеть не будет восстановлена.

  3. Другой подход заключается в использовании backgroundSessionConfigurationWithIdentifier из NSURLSessionConfiguration. См. Downloading Content in the Background. Если вы сделаете это, у вас будет больше 3 минут для завершения запроса. И он будет автоматически запускаться, как только соединение восстановится. Недостатки этого метода заключаются в том, что (а) фоновые сеансы не так чувствительны, как сеансы переднего плана; (b) он ограничен iOS 7 и более поздними версиями; и (c) вам необходимо реализовать делегирование на основе делегирования NSURLSession, а не исполнение блока завершения, что немного больше.

Откровенно говоря, я, как правило, склоняюсь к третьему подходу, но у каждого есть свои достоинства.

+0

Как вы достигаете третьего подхода? Можете ли вы привести пример повторной загрузки задачи загрузки? – Ash

+0

Красота третьего подхода заключается в том, что вам не нужно выполнять логику повтора. Система автоматически попытается выполнить запрос, когда сетевое подключение будет восстановлено. – Rob

+0

Итак, если 'didCompleteWithError' вызывается с ошибкой, отличной от нуля, означает ли это (возможно), что были предприняты несколько попыток повтора до того, как они попали в точку с ошибкой? – Ash

Смежные вопросы