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

Posted

技术标签:

【中文标题】writeToFile:atomically: 会阻止异步读取吗?【英文标题】:Does writeToFile:atomically: blocks asynchronous reading? 【发布时间】:2012-11-10 17:43:43 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

writeToFile:atomically: 会阻塞异步读取吗?

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

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

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

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

【讨论】:

我敢肯定,这将是最好的解决方案。但是由于文件的格式是由我使用的库定义的,所以这是不可能的。 >> writeToFile:atomically: 会阻塞异步读取吗? -- 意味着读取另一个文件。看起来文件的读取是在另一个文件的写入完成时开始的......【参考方案2】:

您必须查看 NSFileHandle 类。 结合使用 seekToEndOfFile 和 writeData:(NSData *)data 你可以做你想做的工作。

【讨论】:

以上是关于writeToFile:atomically: 会阻止异步读取吗?的主要内容,如果未能解决你的问题,请参考以下文章

writeToFile:atomically: 不保存新的 plist 数据

增量写入 plist 文件

iPhone Objective C - 保存数据

将 NSMutableArray 保存到 iPhone 文档目录

iOS - 数据存储方式(本地化)

将文件名与文件扩展名 Cocoa 分开?