我正在尝试为我们的应用程序创建一个简单的下载器。该应用程序将从我们的服务器下载大文件(每个文件至少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个下载任务将同时开始下载。
我真的很感激,如果任何人都可以帮助我确定我的代码有什么问题。
这不是一个真正的大问题,如果这是正常的行为。我只是认为我可能做错了什么,因为我已经看到使用NSURLSession backgroundSessionConfigurationWithIdentifier下载多个文件的项目,它们都开始同时下载。这个项目就是一个例子:https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started –
如果你设置'shouldUseExtendedBackgroundIdleMode',它*可能会更愿意这样做,但我不会当然。另一个窍门是所有的并发限制都是每会话,IIRC,所以如果你为每个请求创建单独的后台会话...有点恶心,但它可能会得到你想要的结果。无论是否值得做,我都不能说。 :-D – dgatwood
似乎它确实将连接限制在4 max,并且诚实地说,因为这不是一个大问题,我会保持原样。我会将你的回答标记为正确的,因为你对我的问题给出了非常合理的答案。感谢您的帮助! –