具有后台会话的许多任务(NSURLSessionDownloadTask)导致使用AFNetworking失败

时间:2016-12-18 02:45:46

标签: ios afnetworking nsurlsession nsurlsessiondownloadtask

我们最近使用AFHTTPRequestOperation中的NSURLSessionDownloadTasAFURLSessionManager迁移到AFNetworking 3 k。我们的用户可以选择下载最多包含5,000个文件的项目。

这些文件主要是PDF和MP4,大小从10 KB到1 GB不等。作为使用NSURLSessionAFURLSessionManager迁移的一部分,我们很高兴能够在应用程序进入后台时将这些下载内容移至系统,以便继续下载。但我们遇到的是这些下载将开始失败并显示错误消息

  

与后台转接服务失去联系

- 或 -

  

"没有这样的文件或目录"

当用户选择下载超过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

}];

1 个答案:

答案 0 :(得分:1)

如果你试图在会话中添加超过几十个任务,那么IIRC,NSURLSession会爆炸。当你达到500时,你几乎可以保证打破它。这是一个已知的错误,因为Stack Overflow上的其他人遇到了它并提交了有关它的错误。也就是说,请提交一个错误,因为Apple对此问题的了解越多,其优先级就越高。

通常的解决方法是保留待处理请求的外部队列,然后在其他任务完成时将任务添加到会话中。