0

我想知道是否有人对性能更好的方法有所了解:进行核心数据提取或在磁盘上查找文件。

我现在的情况是下载记录,每条记录都有一个与之相关的图像。但是不同的记录可以有相同的图像,所以我不想下载图像两次。我将图像保存到磁盘并使用 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];

此外,仪器中有什么东西可以让我计时吗?这将是一个方便的工具,知道如何在未来使用。谢谢。

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] 文件管理器 - 运行时间为:0.000325 2013-01-25 14:31:06.359 FormulaOne[26554:12b03] coredata - 运行时间为:0.000491 2013-01- 25 14:31:11.958 FormulaOne[26554:12b03] 文件管理器 - 运行时间为:0.000178 2013-01-25 14:31:11.959 FormulaOne[26554:12b03] coredata - 运行时间为:0.000417 2013-01-25 14:31 :14.840 FormulaOne[26554:12b03] 文件管理器 - 运行时间为: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] 文件管理器 - 运行时间为:0.000193 2013-01-25 14:33:10.870 FormulaOne[26554:12b03] coredata - 运行时间为:0.000540 2013-01-25 14:33:13.087 FormulaOne[26554:12b03]文件管理器 - 运行时间为: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] 文件管理器 - 运行时间是:0.000346 2013-01-25 14:36:27.761 FormulaOne[28209:12b03] coredata - 运行时间是:0.000601 2013-01- 25 14:36:29.978 FormulaOne[28209:12b03] 文件管理器 - 运行时间为:0.000182 2013-01-25 14:36:29.979 FormulaOne[28209:12b03] coredata - 运行时间为:0.000479 2013-01-25 14:36 :31.585 FormulaOne[28209:12b03] 文件管理器 - 运行时间为: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] 文件管理器 - 运行时间为:0.000307 2013-01-25 14:36:34.924 FormulaOne[28209:12b03] coredata - 运行时间为:0.001055 2013-01-25 14:36:36.038 FormulaOne[28209:12b03]文件管理器 - 运行时间为:0.000318 2013-01-25 14:36:36.040 FormulaOne [28209:12b03] coredata - 运行时间为:0。000740

于 2013-01-25T22:40:51.690 回答