我正在尝试为我们的应用创建一个简单的下载器。该应用程序将从我们的服务器下载大文件(每个文件至少100 MB),所以我想实现一个即使应用程序处于非活动状态也能正常工作的下载程序。
我使用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 :(得分:0)
后台会话在单独的后台守护程序中进行。苹果似乎很有可能故意限制更改该参数的能力,以防止在您的应用未运行时异常大量的转移在飞行中。
您可以向Apple提交错误,但我怀疑他们会将其发回作为"行为正确"。
那就是说,我不确定你是通过使用大量并行下载来实现的。除非ISP出现异常高的数据包丢失或故意限制(例如突发模式),否则在一次运行十次大量下载和平均每次运行十次之间不应该有太大区别。