2

我在 iPhone 应用程序中遇到问题,当应用程序重新启动时,某些文件在应用程序运行时显示为 0 大小。我已经检查了我的代码。这些文件的编写方式基本上是:

   NSFileHandle *fHandle = [NSFileHandle fileHandleForWritingAtPath: myFileName];
   do 
   {
        // code to set value of myNSData
        [fHandle writeData: myNSData];
        // some more logic here
   } 
   while (!done)

   [fHandle closeFile];

我已经在模拟器和真实设备上看到了这个问题。它只是偶尔发生,所以情况很难追踪。

我的问题是:我是否需要调用 [fHandle synchronizeFile] 来确保数据进入永久存储?当我重新打开应用程序时,iOS 是否有可能在将文件缓冲区发送到永久存储之前丢失文件缓冲区中的数据,从而导致 0 大小的文件?

4

3 回答 3

1

根据文档,这是有保证的:

同步文件
导致所表示的文件的所有内存数据和属性
由接收方写入永久存储。

- (void)synchronizeFile

讨论
此方法应由需要
文件始终处于已知状态。对此的调用
方法在内存被刷新之前不会返回。

所以只要你调用synchronizeFile,就可以确定你写的所有内容都被刷新了。

于 2012-07-28T18:20:58.807 回答
1

我不确定写入数据时的 NSFileHandle 结果,但我建议使用 NSData 的writeToFile:atomically:方法,因为“原子”标志可以满足您的要求 - 它保证所有数据都已写入,或者没有。

于 2012-07-28T17:44:25.700 回答
0

据我所知,它不需要被调用(也许除非你做了一些非常棘手的线程/GCD/什么)。对我来说,只需调用 writeData: 和 closeFile 就足够了。

于 2012-07-28T17:44:44.593 回答