- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要从服务器下载一些图片和一段视频:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
for (int i = 0; i < _collectionArr.count; ++i) {
NSURL *URL = [NSURL URLWithString:URL_ADDRESS(portNumber,_collectionArr[i])];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
if (i == _collectionArr.count - 1) {
[SVProgressHUD showSuccessWithStatus:@"Done"];
}
}];
[downloadTask resume];
}
我发现它好慢!速度约为 200K/s,Android 的时间比 iPhone 少 2/3。当我下载一个大约 4.6M 的 mp4 时,需要 15 秒。
2014-11-29 13:46:35.071 testDownload[2105:47825] Begin
2014-11-29 13:46:51.740 testDownload[2105:47825] File downloaded to: file:///Users/apple/Library/Developer/CoreSimulator/Devices/259F2CB8-01FD-47C2-A38F-6100A2FF350A/data/Containers/Data/Application/71E553BC-F85D-4BFA-8937-FE9026FDF65C/Documents/VTS_01_audi.mp4
但是当我使用其他应用程序下载电影时,它可以是 2M/s。我在使用 afnetworking 时错了吗?它是如何发生的,我能做些什么来处理它。另一个问题是,我知道用 if (i == _collectionArr.count - 1){[SVProgressHUD showSuccessWithStatus:@"Done"];} 监控最后一个请求是错误的,但我不知道正确答案。
感谢您的帮助。
最佳答案
几个想法:
在 i
时移除 HUD点击 count - 1
是不正确的。实际上,您可以在它们全部完成之前将其删除。如果您开始两个下载,一个大下载和一个小下载,HUD 将在第二个完成时消失,但另一个可能还没有完成。它们同时运行,所以你必须等到它们全部完成,而不是等到最后一个提交的完成。
执行此操作的一种方法是使用调度组(您在提交请求时输入,留在完成 block 中,然后添加删除 HUD 的调度组通知)。
除了这段代码之外,您没有做任何其他可能阻塞主线程的事情吗? AFNetworking 将其完成 block 分派(dispatch)到主队列,如果您为任何事情阻塞主线程,将会影响此性能。您可以使用 Instruments 来识别等待线程,或者仅出于测试目的,临时更改 completionQueue
的 manager
成为您自己创建的自定义队列。
例如,在您的 for
之前循环,做类似的事情:
manager.completionQueue = dispatch_queue_create("com.example.app.netCompletionQueue", NULL);
这会将主线程阻塞排除在等式之外(尽管我觉得这不太可能,除非您在主线程中做一些特别的事情)。但是,一旦您确认这不是问题所在,请注释掉该行,因为您确实希望将主线程用于完成 block 。
一旦您确认 perf 问题不是由主线程争用问题引起的,我建议您对替代技术(例如您自己的 NSURLSession
等)进行一些基准测试。这可以帮助诊断问题是否出在 AFNetworking 上,而不是像模拟器与设备性能、缓存等问题。坦率地说,我发现 AFNetworking 本身不太可能是问题所在。
关于ios - 如何在使用 NSURLSessionDownloadTask 时提高速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27199501/
我在使用 NSURLSessionDownloadTask 处理 ios 上的“空间不足”/“磁盘已满”错误时遇到问题 如果由于应用程序中完成下载而导致磁盘已满,我会接到电话 URLSession(
我使用NSURLSessionDownloadTask从服务器下载文件,该文件在后台 session 中运行。我想保存恢复数据以在应用终止时恢复下载。但是,对cancelByProducingResu
我有一个主机应用程序,它有一个完美运行的后台下载 session ,但是通过今天的扩展启动下载我得到这个错误: The operation couldn’t be completed. (NSURLE
我是 NSURLSession 的新手,我没有在其他 stackoverflow 问题中找到答案。所以我发布这个。 我的 ViewController 中有一个 Button 和 ProgressBa
我有以下一段代码,它已经工作了几个月,并且刚刚开始间歇性地损坏。 我正在改变它被调用的方式,所以这并不完全不足为奇,但症状让我感到困惑。某些请求正在下载的临时文件似乎在读取数据之前被删除。 我有关于文
我正在使用 NSURLSessionDownloadTask 下载文件。在应用程序的某一时刻,有必要暂停下载一小段时间,然后再继续下载。我尝试使用暂停方法暂停下载,但任务继续下载。 NSURLSess
有人可以帮我把这个语句翻译成 Swift 吗? NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request
使用 NSURLSessionDownloadTask 连续下载文件列表的最佳做法是什么? 例如,是否最好在上一次下载完成后开始一个新的 NSURLSession? - (void)startDown
我需要按顺序下载文件。目前我可以在应用程序处于前台时执行此操作。 以下是我使用的逻辑。 创建所有下载任务。 一次恢复一个,当前完成后从 URLSession:task:didCompleteWithE
我正在使用 nsurlsession 来管理下载图像/视频文件。问题是有时请求会出错并返回“找不到内容”之类的文本。我如何确保正在下载的文件确实是我请求的文件类型? (例如 .jpeg 或 .mp4)
我添加“下载任务”并终止应用进程。 运行app后,获取[manager downloadTasks];并恢复所有。但文件未加载到 Documets 目录中。 我使用 AFNetworking 2.0
这就是我使用 NSURLSessionDownloadTask 的方式: let sessionConfiguration = NSURLSessionConfiguration.defaul
我的 iOS 应用程序使用 NSURLSessionConfiguration、NSURLSession、NSURLSessionDownloadTask 等来下载我们的服务器从数据库中动态生成的 x
我想知道我是否可以检索失败的 NSURLSessionDownloadTask 的部分下载数据。 我的用例是: 我开始下载一个 1024MB 的文件 已下载 512MB 网络中断下载失败 下载失败时,
我需要使用桌面应用程序下载文件。首先,我创建了一个简单的iOS项目,用于下载视频文件,引用这个web site 。有用。我想为 macOS 做几乎同样的事情。 class ViewController
我正在使用 NSURLSessionDownloadTask 下载网页文件。当我使用 [NSURLSessionConfiguration backgroundSessionConfiguration
我正在尝试使用 NSURLSessionDownloadTask 下载一个大文件。但是,我只想下载该文件的前 10MB。我知道如何在下载 10MB 后取消操作,但如何强制调用 didFinishDow
在我的应用程序中,我从 Web 服务获取 JSON。此 JSON 包含我要下载的几个文件的网址。 我想使用 NSURLSessionDownloadTask 一个一个地下载每个文件(等待第一个下载完成
我需要从服务器下载一些图片和一段视频: NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSes
在我的应用程序中,我目前正在使用 NSURLSessionDownloadTask通过 HTTP 获取文件。 此类提供了一个有用的委托(delegate)接口(interface)来监控其进度并在通过
我是一名优秀的程序员,十分优秀!