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

データを書き込むときの NSFileHandle の結果についてはわかりませんが、NSData のwriteToFile:atomically:方法を使用することをお勧めします。「アトミックに」フラグがまさにあなたが求めていることを達成するためです。すべてのデータが書き込まれるか、何も書き込まれないことが保証されます。

于 2012-07-28T17:44:25.700 に答える
1

docsによると、これは保証されています:

同期ファイル
ファイルのすべてのメモリ内データと属性が表示されます。
永久ストレージに書き込まれます。

- (void)synchronizeFile

討論
このメソッドは、
ファイルは常に既知の状態になります。これの呼び出し
メソッドは、メモリがフラッシュされるまで戻りません。

したがって、 を呼び出す限り、synchronizeFile作成したすべてのコンテンツが確実にフラッシュされます。

于 2012-07-28T18:20:58.807 に答える
0

私の知る限り、呼び出す必要はありません (おそらく、非常にトリッキーなスレッド/GCD などを実行しない限り)。私にとっては、writeData: と closeFile を呼び出すだけで十分です。

于 2012-07-28T17:44:44.593 に答える