我在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大小的文件?
答案 0 :(得分:1)
我在编写数据时不确定NSFileHandle的结果,但我建议使用NSData的writeToFile:atomically:
方法,因为“原子”标志实现了你所要求的 - 它保证所有数据是写的,或者没有。
答案 1 :(得分:1)
根据docs,这是有保证的:
synchronizeFile Causes all in-memory data and attributes of the file represented by the receiver to be written to permanent storage. - (void)synchronizeFile Discussion This method should be invoked by programs that require the file to always be in a known state. An invocation of this method does not return until memory is flushed.
因此,只要您致电synchronizeFile
,就可以确保您所写的所有内容都已刷新。
答案 2 :(得分:0)
据我所知,它不需要被调用(可能除非你做一些非常棘手的线程/ GCD /无论如何)。对我来说,只需调用writeData:和closeFile就足够了。