2

アプリケーションを使用しているときに、バックグラウンドで大きなデータを処理していることが数回あります。(ユーザーが必要なときに準備するため。何らかのインデックス付け。)このバックグラウンドプロセスが終了したら、データをキャッシュファイルに保存する必要がありますが、これは非常に大きいため、数秒かかります。

しかし同時に、ユーザーはディスクからロードされた画像とテキストを表示するダイアログを開くことができます。バックグラウンドプロセスデータの保存と同時にこれが発生した場合、ユーザーインターフェイスは保存プロセスが完了するまで待機する必要があります。(ユーザーはディスクから画像とテキストが読み込まれるまで3〜4秒待つ必要があるため、これは望ましくありません!)

だから私はディスクへの書き込みを抑える方法を探しています。データをチャンクに分割し、異なるチャンクを保存する間に短い遅延を挿入することを考えました。この遅延では、ユーザーインターフェイスが必要なテキストと画像を読み込むことができるため、ユーザーは遅延を認識しません。

現在、私はを使用して[[array componentsJoinedByString:'\n'] writeToFile:@"some name.dic" atomically:YES]います。これは非常に高レベルのソリューションであり、カスタマイズはできません。すべてのデータをワンショットで保存せずに、大きなデータなしで1つのファイルに実装するにはどうすればよいですか?

4

2 に答える 2

2

writeToFile:atomically:非同期読み取りをブロックしますか?

いいえ。一時ファイルに書き込むようなものです。正常に完了したら、一時ファイルの名前を宛先に変更します(宛先にある既存のファイルが存在する場合はそれを置き換えます)。

データをどのように分割できるかを検討する必要があります。そうすれば、それほど遅くはなりません。すべてが文字列/行で分割され、数秒かかる場合、データベースを分割する簡単な方法は最初の文字です。もちろん、インデックス/データベースへのアクセス、検索、更新の方法に基づいて、より良いソリューションが考えられる可能性があります。

…異なるチャンクを保存する間に短い遅延を挿入します。この遅延では、ユーザーインターフェイスが必要なテキストと画像を読み込むことができるため、ユーザーは遅延を認識しません。

しないでください。アトミック書き込みの移動/置換を自分で実装するだけです(インデックス作成および書き込み中に一時ファイルに書き込みます)。次に、アプリは読み取りコマンドと書き込みコマンドを明示的にシリアル化して、これらの共有リソースへの高速で一貫性のある正しいアクセスを実現できます。

于 2012-11-10T21:58:12.423 に答える
1

クラスNSFileHandleを調べる必要があります。seekToEndOfFileとwriteData:(NSData *)dataの組み合わせを使用して、必要な作業を実行できます。

于 2012-11-10T17:57:26.033 に答える