2016-10-03 21 views
0

我正在尝试为我们的应用程序创建一个简单的下载器。该应用程序将从我们的服务器下载大文件(每个文件至少100 MB),所以我想实现一个即使应用程序处于非活动状态也可以工作的下载程序。在[NSURLSession backgroundSessionConfigurationWithIdentifier]上设置最大http连接不起作用

我使用NSURLSession来处理此请求。下面是如何初始化会话:

@property (nonatomic) NSURLSession *downloadSession; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Initialise the session 
    NSURLSessionConfiguration *sessionConfig = [NSURLSession backgroundSessionConfigurationWithIdentifier: @"backgroundSessionIdentifier"]; 
    [sessionConfig setHTTPMaximumConnectionsPerHost:10]; 

    _downloadSession = [NSURLSession sessionWithConfiguration: sessionConfig delegate: self delegateQueue: nil]; 
} 

我也实现了以下NSURLSessionDownloadDelegate功能检查每个下载的进度:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { 
    float totalProgress = (float)totalBytesWritten/(float)totalBytesExpectedToWrite; 
    NSLog(@"URL: %@, progress: %f", downloadTask.originalRequest.URL.absoluteString, totalProgress); 
} 

我有一个UICollectionView和每个单元都有一个按钮,将创建一个点击下载任务:

// A delegate function of the custom UICollectionViewCell 
- (void)beginDownloadAtIndex:(NSInteger)fileIndex { 
    NSString *fileURL = [self.urls objectAtIndex: fileIndex]; 
    NSURLSessionDownloadTask *downloadTask = [self.downloadSession downloadTaskWithURL: [NSURL URLWithString: fileURL]]; 
    [downloadTask resume]; 
} 

现在说我有UICollectionView中的10个项目。我将HTTPMaximumConnectionsPerHost设置为10,以便我可以同时下载它们。

会发生什么是我创建的前3个下载任务将同时开始下载,但其他7个不会。当前3个下载任务中的一个完成后,其中一个“休眠”下载任务将开始下载。

我可能做错了什么,因为当我尝试使用默认会话配置[NSURLSessionConfiguration defaultSessionConfiguration]时,所有10个下载任务将同时开始下载。

我真的很感激,如果任何人都可以帮助我确定我的代码有什么问题。

回答

0

背景会话在单独的背景守护进程中发生进程外。苹果似乎很有可能故意限制改变该参数的能力,以防止在应用程序不运行时出现异常大量的传输。

您可以向Apple提交错误消息,但我怀疑他们会将其发回为“正确行为”。

这就是说,我不确定你想通过使用大量的并行下载来实现什么。除非出现异常高的数据包丢失或由ISP故意限制(例如突发模式),平均每次运行10次大容量下载和平均每次运行10次应该没有多大区别。

+0

这不是一个真正的大问题,如果这是正常的行为。我只是认为我可能做错了什么,因为我已经看到使用NSURLSession backgroundSessionConfigurationWithIdentifier下载多个文件的项目,它们都开始同时下载。这个项目就是一个例子:https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –

+0

如果你设置'shouldUseExtendedBackgroundIdleMode',它*可能会更愿意这样做,但我不会当然。另一个窍门是所有的并发限制都是每会话,IIRC,所以如果你为每个请求创建单独的后台会话...有点恶心,但它可能会得到你想要的结果。无论是否值得做,我都不能说。 :-D – dgatwood

+0

似乎它确实将连接限制在4 max,并且诚实地说,因为这不是一个大问题,我会保持原样。我会将你的回答标记为正确的,因为你对我的问题给出了非常合理的答案。感谢您的帮助! –