2016-05-01 5 views
0

iOSデバイスのディスク上のファイルとWebサービスの何千ものファイルを一致させる必要があります。現在私はこれをループで行い、ディスク上のすべてのファイルをattributesOfItemAtPathshared NSFileManager)に検証して、ファイルのサイズが変更されていないかどうかを確認しますが、間違っていると感じます。たぶん、すべてのファイルをループするのが最もクリーンな方法ですが、余分なディスクI/Oを害することなく、ディレクトリ内のすべてのファイル(またはNSDictionary)のすべてのファイルに対してattributesOfItemAtPathを実行する方法があるかどうかは疑問でした。多くのファイルのためのattributesOfItemAtPath

コードがループ内で実行され、その後、それがない、ディスク上のすべてのファイルについて:

fileAttributes = [_Core.fileMgr attributesOfItemAtPath:savePath error:nil]; 

if ([fileAttributes fileSize] != [[image valueForKey:@"filesize"] intValue]) { 
    ... // the file has changed or is new 
} 

私はすでにそれを再ロードするアプリ経由になると、最後の既知のファイルサイズをキャッシュと思っています多くのファイルの属性をより効率的に取得するためのより効率的な方法があれば、私はまだ疑問に思っていますローレベル効率的な方法です。

最後に、このコードは私に遅さを与えていません。私は、過度のディスクI/Oを排除する方法があるのか​​どうか疑問に思っています。時にはこのスクリプトが数百から数千メガバイトのイメージをダウンロードし、長い時間がかかり、多くのディスクヒットをすることがあるからです。おそらく、NSPathUtilitiesのような非常に低いレベルで可能なことがありますか?私はむしろ2〜4MBのメモリをキャッシュしてリストをキャッシュし、ディスクを何千も追加することなく何千ものディスクに書き込むことになります。

答えて

1

アプリケーションを再起動するたびにループを実行する必要がありますが、アプリケーションの実行中に変更を処理するには、https://github.com/bdkjones/VDKQueueなどのキューシステムをファイルシステムイベントの監視に使用できます。

実際にファイルが変更されているかどうかわからない場合や、デバイス上で何か変更があった場合はいつでも、変更を記録してからサーバーに設定されている変更を確認するだけです。

+0

これは素晴らしいことです。私は確かにそれを調べます。 VDKはGCDを必要としているようですが、readmeには明示的にOS Xが必要だと書かれています。 (古い)iPad 3での7kファイルのチェックは、現在約2秒かかります。これは当初、または(1時間のインターバルタイマーで)アプリをリロードするときに発生するので、それほど悪くはありません。私はちょうどこの素晴らしい最適化フローにあり、どこでもCPUサイクルとメモリチャンクを獲得しようとしています:)。チップ1+ –

関連する問題