【问题标题】:iOS Efficiency File Saving EfficiencyiOS效率文件保存效率
【发布时间】:2012-06-07 22:36:51
【问题描述】:
我正在开发我的 iOS 应用程序,我的目标是保存从 Internet 接收的文件。我当前的设置是我有一个NSMutableData 对象,并在收到文件时向它添加了一些数据。收到最后一个“数据包”后,我将NSData 写入文件,该过程完成。我有点担心这不是理想的方式,因为移动设备内存有限,而且接收大文件会有问题。
我的下一个想法是实现NSFileHandle,这样当文件到达时,它会被保存到磁盘,而不是虚拟内存。
在速度和效率方面,您认为哪种方法在 iOS 设备上运行得很好。我目前正在使用第一种NSMutableData 方法。是否值得将我的应用更改为使用NSFileHandle?
提前致谢,
古维
【问题讨论】:
标签:
objective-c
ios
xcode
filehandle
【解决方案1】:
如果您正在下载的数据是无限的(即没有最大文件大小),那么值得您将一些代码放入您的下载和保存方案中以从“@”中刷新数据987654321@" 对象指向某个临界点的文件(例如 2K、10K、1Meg 等)。然后当内存中的数据对象再次填满时追加到该文件上。
由于 iDevice 没有物理硬盘驱动器(嗯,我的意思是一个旋转的盘片,并且会消耗额外的能量来启动旋转和读写头),所以它也可能是值得的立即将这些字节直接写入文件句柄。我不相信它会在功耗方面花费任何额外费用。更大的功耗是在网络通信中(蜂窝通信是耗电大户,WiFi 连接要少一些)。
【解决方案2】:
取决于您下载的文件有多大。如果您要立即使用该文件,那么第一个选项是最好的,看起来好像它会在保存到磁盘之前先保存到 RAM,然后再将所有内容加载到 RAM 中。但是,如果它是一个非常大的文件,即使它会被使用以便 iPhone 可以在后台处理它,也可能值得将它保存到磁盘。这主要取决于您,只需运行一些测试,看看使用该应用时的感受。
【解决方案3】:
您可以尝试使用 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];