0

コアデータのフェッチを行うか、ディスク上のファイルを検索するなど、パフォーマンスが向上することについて誰かが洞察を持っているかどうか疑問に思っています。

私がいる状況はレコードのダウンロードであり、各レコードには画像が関連付けられています。しかし、異なるレコードに同じ画像が含まれている可能性があるため、画像を 2 回ダウンロードしたくありません。画像をディスクに保存し、NSManagedObject を使用して Web URL とローカル ファイル パスを保存しています。

私ができる別のネットワーク呼び出しを避けるために

A: コア データ フェッチを実行して、Web URL に基づいて画像が既にあるかどうかを確認します。

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Image class])];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"web_url == %@", myRecord.image_url];

B: ローカル ファイル パスからディスク上の画像データを探す

NSFileManager *fileManager = [NSFileManager defaultManager];
NSData *photoData = [fileManager contentsAtPath:myRecord.photo_path];

さらに、Instruments にこれらの時間を計測できるものはありますか? 将来の使い方を知るのに便利なツールです。ありがとう。

4

1 に答える 1

0

私は最終的に、この NSHipster の記事http://nshipster.com/reader-submissions-new-years-2013/で実行時間を測定するためにユーザーが提出したマクロの助けを借りて、これをテストすることに成功しました。

テストされたコードは次のとおりです

__block NSData *photoData;
const char *caller = "filemanager";
MVComputeTimeWithNameAndBlock(caller, ^{
NSFileManager *fileManager = [NSFileManager defaultManager];
photoData = [fileManager contentsAtPath:[self createLocalFilePath:myRecord.photo_path]];
});

caller = "coredata";
MVComputeTimeWithNameAndBlock(caller, ^{
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Image class])];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"web_url == %@", myRecord.image_url];
    NSError *error;
    NSArray *arr = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    if([arr count]){
        Image *photo = arr[0];
    }
});

2013-01-25 14:31:06.359 FormulaOne[26554:12b03] filemanager - 実行時間: 0.000325 2013-01-25 14:31:06.359 FormulaOne[26554:12b03] コアデータ - 実行時間: 0.000491 2013-01- 25 14:31:11.958 FormulaOne[26554:12b03] filemanager - 実行時間: 0.000178 2013-01-25 14:31:11.959 FormulaOne[26554:12b03] コアデータ - 実行時間: 0.000417 2013-01-25 14:31 :14.840 FormulaOne[26554:12b03] filemanager - 実行時間: 0.000187 2013-01-25 14:31:14.841 FormulaOne[26554:12b03] coredata - 実行時間: 0.000421 2013-01-25 14:33:10.869 FormulaOne[ 26554:12b03] filemanager - 実行時間: 0.000193 2013-01-25 14:33:10.870 FormulaOne[26554:12b03] filemanager - 実行時間: 0.000170 2013-01-25 14:33:13.088 FormulaOne[26554:12b03] coredata - 実行時間: 0。000392

に切り替えました

int count = [[self managedObjectContext] countForFetchRequest:fetchRequest error:&error];

オブジェクトは実際には必要ないので、その存在を知る必要があるだけです。タイミングは実際にはもっと悪かった。

2013-01-25 14:36:27.760 FormulaOne[28209:12b03] filemanager - 実行時間: 0.000346 2013-01-25 14:36:27.761 FormulaOne[28209:12b03] コアデータ - 実行時間: 0.000601 2013-01- 25 14:36:29.978 FormulaOne[28209:12b03] filemanager - 実行時間: 0.000182 2013-01-25 14:36:29.979 FormulaOne[28209:12b03] コアデータ - 実行時間: 0.000479 2013-01-25 14:36 :31.585 FormulaOne[28209:12b03] filemanager - 実行時間: 0.000265 2013-01-25 14:36:31.586 FormulaOne[28209:12b03] coredata - 実行時間: 0.000400 2013-01-25 14:36:34.923 FormulaOne[ 28209:12b03] filemanager - 実行時間: 0.000307 2013-01-25 14:36:34.924 FormulaOne[28209:12b03] filemanager - 実行時間: 0.000318 2013-01-25 14:36:36.040 FormulaOne[28209:12b03] coredata - 実行時間: 0。000740

于 2013-01-25T22:40:51.690 に答える