在 iOS 上将数据从磁盘发送到服务器而不加载到 ram
Posted
技术标签:
【中文标题】在 iOS 上将数据从磁盘发送到服务器而不加载到 ram【英文标题】:Sending data from disk to server without loading into ram on iOS 【发布时间】:2018-02-01 17:27:13 【问题描述】:我正在开发一个有时需要向我们的服务器发送大文件 (500MB) 或更多文件的应用程序。通常,文件已经存储在磁盘上,并且我将拥有本地文件 URL,有没有一种方法可以创建 NSMutableRequest 而无需先将 所有数据从磁盘加载到 NSData 中?
一次从磁盘读取几 MB 的数据,发送出去,然后重复直到它全部消失,这将是很好的。最好/最有效的方法是什么?
编辑
基本上,如果我想上传一个 10GB 的视频,在系统因内存限制而终止我的应用程序之前,我永远无法将其全部放入 NSData。
【问题讨论】:
除非设备有一些专用硬件连接到“磁盘”和收音机,否则我认为“不将数据加载到 RAM”是不可能的。 对不起,应该指定而不必一次将其全部加载到 ram 中,一次只需几 MB 基本上,如果我想上传一个 10GB 的视频,在系统由于内存限制而终止我的应用程序之前,我永远无法将其放入 NSData。 看看这个:***.com/questions/31965566/… 这似乎是关于写入到磁盘,但相同或相似的API应该会有所帮助 【参考方案1】:基本上,您需要按位读取大型本地文件并通过网络发送。您可以使用基础类NSInputStream
来做到这一点。
来自Apple's documentation(Objective-C)的示例代码:
- (void)setUpStreamForFile:(NSString *)path
// iStream is NSInputStream instance variable
iStream = [[NSInputStream alloc] initWithFileAtPath:path];
[iStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[iStream open];
在 Swift 3 中,应该是这样的:
func setUpStream(forFile path: String) -> InputStream?
guard let stream = InputStream(fileAtPath: path) else
return nil
stream.delegate = self
stream.schedule(in: RunLoop.current, forMode: .defaultRunLoopMode)
stream.open()
return stream
(您还需要采用协议NSStreamDelegate,但这足以让 oyu 开始我猜......)
【讨论】:
以上是关于在 iOS 上将数据从磁盘发送到服务器而不加载到 ram的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS8 上将 ABPersonViewController 推送到 ABPeoplePickerNavigationController
json swift ios - 将参数发送到 php-sql
如何在 iOs 或 Android air 项目 (AS3) 上将下载的资产保存到磁盘