2016-12-18 9 views
2

Мы недавно мигрировали из AFHTTPRequestOperation в NSURLSessionDownloadTas к используя AFURLSessionManager в AFNetworking 3. Наши пользователи имеют возможность загрузки элементов, которые могут содержать до 5000 файлов.Многие задачи (NSURLSessionDownloadTask) с фоновой сессией приводит к сбою при помощи AFNetworking

Эти файлы в основном PDF и MP4 и имеют размер от 10 КБ до 1 ГБ. В рамках перехода на использование NSURLSession и AFURLSessionManager мы были рады, что можем отправить эти загрузки в систему, когда приложение войдет в фоновое изображение, что позволит продолжить скачивание. Но то, что мы переживаем эти загрузки начнется сбой с сообщением об ошибке в

потерял связь с фоном передачи обслуживания

-или-

«нет такого файла или справочник "

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

Любые идеи, если это ограничение iOS и NSURLSession с конфигурацией фона или если мы сможем заставить это работать?

Наша AFURLSessionManager выглядит следующим образом:

NSURLSessionConfiguration *configuration = 
[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.our.app.identifier.downloads"]; 
[configuration setHTTPMaximumConnectionsPerHost:5]; 
AFURLSessionManager *sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 
[sessionManager setCompletionQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)]; 

И задачи выглядит следующим образом:

NSURLSessionDownloadTask *downloadTask = [self.sessionManager downloadTaskWithRequest:[self requestForItem:item] progress:nil 

destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { 

    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    return [NSURL fileURLWithPath:[filePath stringByAppendingPathComponent:@"fileid.ext"]]; 

} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { 

    // check for error and notify the ui of completion 

}]; 
+0

Я просто хотел сказать для нового пользователя, что это был отличный отформатированный вопрос. Хотел бы я помочь тебе больше. –

ответ

0

IIRC, NSURLSession взрывается в огне, если вы попытаетесь добавить больше, чем несколько до десятка задач на сеанс. К тому времени, когда вы получите до 500, вы в значительной степени гарантированно сломаете его. Это известная ошибка, так как другие люди в Stack Overflow столкнулись с ней и обнаружили ошибки. Тем не менее, пожалуйста, напишите ошибку, потому что чем больше ошибок Apple получит о проблеме, тем выше ее приоритет.

Обычным обходным решением является сохранение внешней очереди ожидающих запросов, а затем добавление задач в сеанс по мере завершения других задач.