将数据从磁盘发送到服务器而不加载到iOS上的ram

时间:2017-08-24 00:50:56

标签: ios memory-management

我正在开发一个有时需要向我们的服务器发送大文件(500MB)或更多文件的应用程序。通常文件已经存储在磁盘上,我将拥有本地文件URL,有没有办法创建NSMutableRequest而无需先将所有数据从磁盘加载到NSData中?

一次从磁盘读取几MB,将其发送出去,然后重复直到它全部消失,这样会很好。什么是最好/最有效的方法?

修改

基本上,如果我想上传一个10GB的视频,由于内存限制,在系统终止我的应用之前,我永远无法将所有视频都安装到NSData中。

1 个答案:

答案 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开始我猜...)