我正在开发我的iOS应用程序,我的目标是保存一个我从互联网上逐渐收到的文件。我目前的设置是我有一个NSMutableData
对象,并在收到文件时向其添加一些数据。收到最后一个“数据包”后,我将NSData
写入文件,然后该过程完成。我有点担心这不是理想的方法,因为移动设备中RAM的限制,接收大文件会有问题。
我的下一个想法是实现NSFileHandle
,以便在文件到达时,它将被保存到磁盘,而不是虚拟内存。
在速度和效率方面,您认为哪种方法可以在iOS设备上正常运行。我目前正在使用第一种NSMutableData
方法。是否值得更改我的应用以使用NSFileHandle
?
提前致谢, Guvvy
答案 0 :(得分:1)
如果您下载的数据无限制(即没有最大文件大小),那么将一些代码放入您的下载和放大器中是值得的。保存方案将数据从“NSMutableData
”对象刷新到某个临界点的文件(例如2K,10K,1Meg,等等)。然后当内存中的数据对象再次填满时附加到该文件上。
由于iDevice没有物理硬盘驱动器(好吧,我的意思是一个旋转的盘片和额外的功率来启动旋转和读取和写入头),它也可能是值得的只需将这些字节直接写入文件句柄即可。我不相信它在功耗方面会花费额外的费用。更大的功耗是在网络通信中(蜂窝通信是电力消耗,WiFi连接少一点)。
答案 1 :(得分:0)
取决于您下载的文件有多大。如果您要立即使用该文件,那么第一个选项将是最好的,看起来它在保存到磁盘之前首先保存到RAM,然后再次加载到RAM中。但是,如果它是一个非常大的文件,可能值得将它保存到磁盘,即使它将被使用,以便iPhone可以在后台处理它。主要取决于您,只需运行一些测试,看看使用该应用程序时的感受。
答案 2 :(得分:0)
您可以尝试使用AFNetworking及其Streaming Request:
NSURL *url = aUrl;
NSString *path = aPath;
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:YES];
[operation start];