2014-02-19 5 views
1

Я пытаюсь запустить фон NSURLSessionDownloadTask. Тем не менее, я заметил, что это займет примерно 30 секунд, прежде чем задача начнется. Когда я использую defaultSessionConfiguration, задача начинается почти сразу. Есть ли способ запустить NSURLSessionDownloadTask сразу же при использовании backgroundSessionConfiguration?Есть ли способ удалить задержку, когда используется [NSURLSessionConfiguration backgroundSessionConfiguration]?

Ниже результат я получаю, когда я использую backgroundSessionConfiguration:

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:[NSString stringWithFormat:bgIdentifier, self.urlModel.code]]; 

Вот выход журнала. Обратите внимание, что «Начать загрузку ...» регистрируется непосредственно перед вызовом метода «резюме», а «Выполнение загрузки» регистрируется в методе didSendData NSURLSessionTaskDelegate.

2014-02-18 20:13:55.403 myapp[396:60b] [DoneViewController] Start uploading... 
2014-02-18 20:14:17.699 myapp[396:60b] [DoneViewController] Upload progress - 1% 
2014-02-18 20:14:17.704 myapp[396:60b] [DoneViewController] Upload progress - 2% 
2014-02-18 20:14:17.705 myapp[396:60b] [DoneViewController] Upload progress - 3% 
2014-02-18 20:14:17.706 myapp[396:60b] [DoneViewController] Upload progress - 4% 

Просто для справки, то же самое, но с конфигурацией сеанса по умолчанию.

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

Вы можете видеть, что нет никакой задержки в результате консоли, как это:

2014-02-18 19:57:00.552 myapp[376:60b] [DoneViewController] Start uploading... 
2014-02-18 19:57:00.707 myapp[376:60b] [DoneViewController] Upload progress - 2% 
2014-02-18 19:57:00.710 myapp[376:60b] [DoneViewController] Upload progress - 5% 
2014-02-18 19:57:00.711 myapp[376:60b] [DoneViewController] Upload progress - 8% 
2014-02-18 19:57:00.711 myapp[376:60b] [DoneViewController] Upload progress - 11% 

Edit: С прошивкой 7.1, бывают случаи, когда нет никаких задержек. Тем не менее, еще есть моменты, когда есть около 20 секундных задержек.

+0

являются у загрузки нескольких файлов одновременно? – ChenSmile

+0

@Immi nope. В обоих случаях я запускал приложение с нуля, чтобы убедиться, что не было никаких длительных сеансов. – jhk

+1

Зачем вам задержка? «Фон» означает «Эй, система, пожалуйста, сделайте это самостоятельно, когда это удобно». Если вы этого не хотите, не делайте этого. – matt

ответ

3

Хотя Apple не документирует его вообще, это то, как разрабатываются фоновые сессии. Вы просто не можете использовать сетевое соединение, пока работает другое приложение. iOS/Apple отвечает за запуск ваших загрузок/загрузок в фоновом режиме, так, как он себя чувствует, обеспечит лучший пользовательский интерфейс. Представьте, что это запущенное приложение и сетевое подключение забито другим при попытке сделать базовые HTTP-вызовы. Я написал больше о моем опыте и когда использовать эту функцию. https://medium.com/@KyleRStewart/zombie-uploads-with-ios-dd3b1f6b66

+0

Это фактически задокументировано Apple в описании метода '+ [NSURLSessionConfiguration backgroundSessionConfiguration:]': «Сессии, созданные с объектами конфигурации, возвращенными этим методы называются фоновыми сеансами. Эти сеансы отличаются от других сеансов следующими способами: Загрузка и загрузка задач в фоновых сеансах выполняется внешним демоном, а не самим приложением. В результате передачи продолжаются в фоновом режиме если приложение приостановлено, завершено или сработает ». –

+1

Лучший ответ. Похоже, что с iOS 8 beta 5 они добавили способ добавить приоритет (NSURLSessionTaskPriorityDefault, NSURLSessionTaskPriorityLow или NSURLSessionTaskPriorityHigh) в конфигурацию фона. https://developer.apple.com/library/prerelease/ios/releasenotes/General/RN-iOSSDK-8.0/ – jhk

0
-(NSURLSession *)backgroundSession // For Background Download 
{ 
static NSURLSession *backgroundSession = nil; 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.shinobicontrols.BackgroundDownload.BackgroundSession"]; 
    backgroundSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 
}); 
return backgroundSession; 
} 

Подробнее Подробнее LINK. Здесь вы можете увидеть различные способы загрузки. Надеюсь, вы получите свое решение здесь.

+0

Спасибо за ответ @Immi! К сожалению, я пробовал это, прежде чем задавать вопрос, но это не помогло. Я даже попытался сыграть с делегатомQueue без везения. – jhk

+0

@ user960112, поэтому я предлагаю u. не заботьтесь о задержке .. потому что в конечном итоге он начинает загружаться. – ChenSmile

+0

Спасибо за предложение. :) Это решение, с которым я столкнулся после того, как потянулся за волосами весь день. Я разместил этот вопрос в надежде выяснить, сможет ли кто-нибудь заново запустить задачу NSURLSession. Это позволит мне получить идеальный UX, который я хочу. – jhk

0

Вы можете попробовать это?

config.discretionary = NO; 

Согласно документации, это:

определяет фоновые задачи могут быть запланированы по усмотрению системы для оптимальной производительности.

Предостережение: вы можете делать это только в том случае, когда приложение находится на переднем плане.

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionConfiguration_class/Reference/Reference.html#//apple_ref/doc/uid/TP40013440-CH1-SW31

+0

Спасибо, что ответили! К сожалению, это было не так. У меня это было НЕТ. – jhk

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