writeToFile:atomically:阻止异步读取吗?

时间:2012-11-10 17:43:44

标签: objective-c ios nsfilemanager

在使用我的应用程序时,我会在后台处理一些大数据。 (在用户需要它时准备好。有点索引。)当这个后台进程完成时,它需要将数据保存在缓存文件中,但由于这个非常大,需要几秒钟。

但与此同时,用户可能会打开一些对话框,显示从磁盘加载的图像和文本。如果在保存后台进程数据的同时发生这种情况,则用户界面需要等到保存进程完成。 (这不是必需的,因为用户必须等待3-4秒才能加载来自磁盘的图像和文本!)

所以我正在寻找一种限制写入磁盘的方法。我想到了以块的形式分割数据并在保存不同的块之间插入一个短暂的延迟。在此延迟中,用户界面将能够加载所需的文本和图像,因此用户将无法识别延迟。

目前我正在使用[[array componentsJoinedByString:'\n'] writeToFile:@"some name.dic" atomically:YES]。这是一个非常高级的解决方案,不允许任何自定义。如何在没有将大数据保存到一个文件中的情况下如何将所有数据保存为一次性?

2 个答案:

答案 0 :(得分:2)

  

writeToFile:atomically:阻止异步读取吗?

没有。这就像写入临时文件。成功完成后,将临时文件重命名为目标(替换目标上的预先存在的文件,如果存在)。

你应该考虑如何打破你的数据,所以它不是那么慢。如果它全部除以字符串/行并且需要几秒钟,并且分割数据库的简单方法将是第一个字符。当然,根据您访问,搜索和更新索引/数据库的方式,可能会想象出更好的解决方案。

  

...在保存不同的块之间插入一个短暂的延迟。在此延迟中,用户界面将能够加载所需的文本和图像,因此用户将无法识别延迟。

别。只需自己实现原子写入的移动/替换(在索引和写入期间写入临时文件)。然后,您的应用程序可以显式地序列化读取和写入命令,以便快速,一致和正确地访问这些共享资源。

答案 1 :(得分:1)

您必须查看NSFileHandle类。 使用seekToEndOfFile和writeData:(NSData *)数据的组合,您可以完成您想要的工作。