如何在ios中将数据以块的形式写入磁盘

Posted

技术标签:

【中文标题】如何在ios中将数据以块的形式写入磁盘【英文标题】:How to write data in chunks into disk in ios 【发布时间】:2015-01-19 13:22:10 【问题描述】:

您好,在我的应用程序中,我正在下载一个 pdf 文件,并且我得到的总大小是大块的。现在,在我以块的形式获取这些数据后,我将其存储在 NSData 对象中,而剩余的块则附加到同一个对象中。在执行此应用程序时,由于内存不足警告而崩溃。有没有办法将数据写入磁盘,然后将数据附加到沙箱中的写入文件。有时文件超过 400 Mb。请帮助我。

【问题讨论】:

【参考方案1】:

NSFileHandle 可用于此:

类似这样的:

Step1:创建一个名为_outputFileHandle的iVar;

NSFileHandle *_outputFileHandle;

Step2:调用prepareDataHandle一次:

第 3 步:每当有数据垃圾进入时,调用writingDataToFile

相应地修改您的工作流程,以便知道文件下载何时完成。

-(void)prepareDataHandle

    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *outputFilePath = [documentsDirectory stringByAppendingPathComponent:@"anoutputfile.xxx"];
     if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath] == NO)
    
        NSLog(@"Create the new file at outputFilePath: %@", outputFilePath);
        BOOL suc = [[NSFileManager defaultManager] createFileAtPath:outputFilePath
                                              contents:nil
                                            attributes:nil];
        NSLog(@"Create file successful?: %u", suc);
    
    _outputFileHandle = [NSFileHandle fileHandleForWritingAtPath:outputFilePath];


-(void)writingDataToFile:(NSData *)dataToWrite

    if (dataToWrite.length != 0)
    
        [_outputFileHandle writeData:dataToWrite];
    
    else   //you can use dataToWrite with length of 0 to indicate the end of downloading or come up with some unique sequence yourself
    
        NSLog(@"Finished writing... close file");
        [_outputFileHandle closeFile];
    

【讨论】:

【参考方案2】:

您可以使用NSOutputStream

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Streams/Articles/WritingOutputStreams.html

【讨论】:

以上是关于如何在ios中将数据以块的形式写入磁盘的主要内容,如果未能解决你的问题,请参考以下文章

.net core web api - 如何以块的形式返回表结果

以块的形式处理比物理内存大得多的数据

以块的形式保存位图图像

在熊猫中将可变长度列表保存到 HDF5

在c#中以块的形式读取整个文件

Python 在 Mac OS 上以块的形式解码 MP3