我正在开发一个有时需要向我们的服务器发送大文件(500MB)或更多文件的应用程序。通常文件已经存储在磁盘上,我将拥有本地文件URL,有没有办法创建NSMutableRequest而无需先将所有数据从磁盘加载到NSData中?
一次从磁盘读取几MB,将其发送出去,然后重复直到它全部消失,这样会很好。什么是最好/最有效的方法?
修改
基本上,如果我想上传一个10GB的视频,由于内存限制,在系统终止我的应用之前,我永远无法将所有视频都安装到NSData中。
答案 0 :(得分: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开始我猜...)