Ios 从SQLite设置文件名,然后直接从文件系统检索图像)。过去的经验法则是,如果图像大小为缩略图,则可以将其存储在SQLite中,但如果图像大小为MB(而不是10s KB),则将其存储在文件系统中开始产生实质性的性能改进。我不认为这回答了为什么你第一次打电话这么慢的问题,但是如果图像更大,这是值得考虑的

Ios 从SQLite设置文件名,然后直接从文件系统检索图像)。过去的经验法则是,如果图像大小为缩略图,则可以将其存储在SQLite中,但如果图像大小为MB(而不是10s KB),则将其存储在文件系统中开始产生实质性的性能改进。我不认为这回答了为什么你第一次打电话这么慢的问题,但是如果图像更大,这是值得考虑的,ios,objective-c,sqlite,uiimage,fmdb,Ios,Objective C,Sqlite,Uiimage,Fmdb,如果您在堆栈溢出中搜索[sqlite]blob性能或执行类似的google搜索,您将看到许多关于在sqlite中存储非常大的blob对象的缺点的讨论 话虽如此,我确实有一个与性能相关的观察:我不会每次都打开和关闭数据库。在应用程序启动时打开数据库一次,并保持其打开状态。这只节省了10毫秒,所以这并不能解决4秒延迟的问题,但它会更有效率 但归根结底,我无法重现您报告的性能延迟。如果您可以创建一个小型单机版,那么我们可以帮助您进行诊断。但我怀疑问题不在您迄今为止与我们共享的代码片段中。我知道它与您

如果您在堆栈溢出中搜索
[sqlite]blob性能
或执行类似的google搜索,您将看到许多关于在sqlite中存储非常大的blob对象的缺点的讨论

话虽如此,我确实有一个与性能相关的观察:我不会每次都打开和关闭数据库。在应用程序启动时打开数据库一次,并保持其打开状态。这只节省了10毫秒,所以这并不能解决4秒延迟的问题,但它会更有效率


但归根结底,我无法重现您报告的性能延迟。如果您可以创建一个小型单机版,那么我们可以帮助您进行诊断。但我怀疑问题不在您迄今为止与我们共享的代码片段中。

我知道它与您的问题无关。然而,为什么不将“映像”保存在应用程序目录中,并将该本地路径保存在DB中呢。我认为这也是一个好主意,因为如果没有更多的图像,那么可能会出现内存警告问题。我不确定为什么会选择这种设计。我不是这个应用的原始开发者。我正在制作一部分,因为它已经交给了我们的团队。检查第一张图片的大小,这需要很长时间。如果该图像很大,这可能是原因,将该数据转换为图像需要4秒的时间。您每次调用方法从数据库中获取数据,并一次返回一个图像。可能你可以得到所有的数据(数组数据),然后根据你的需要调整图像大小。而不是每次都调整大小,当你保存图像时,在那里调整大小并将调整大小的图像保存在DB中。。。640x480。我已经考虑过合并请求,但是正如您所看到的,一旦第一个请求完成,其余的请求就会很快完成。因此,在第一次请求时,会有一些东西将数据库粘住。
-(UIImage*)getImageWithGuid:(NSString *)guid imageSizeKind:(ImageSizeKind)imageSizeKind
    {
        FMDatabase *db = [self openFMDatabase];
        if (!db) {
            return nil;
        }

        NSData *imageData = nil;
        NSString *query = [NSString stringWithFormat:@"SELECT Image FROM images WHERE Guid = '%@' AND MediaType = %d limit 1", guid, imageSizeKind];

        FMResultSet *rs = [db executeQuery:query];

        if ([rs next])
        {
            imageData = [rs dataForColumn:imagesTable.image];
        }

        [rs close];
        [db close];

        if (!imageData) {
            NSLog(@"Image was not found in database '%@' using sql query '%@'", [self databasePath], query);
        }

        UIImage *image = [UIImage imageWithData:imageData];

        return image;
    }
CFAbsoluteTime last = CFAbsoluteTimeGetCurrent();

for (NSInteger i = 0; i < 10; i++) {
    FMResultSet *rs = [database executeQuery:@"select image_data from images where guid = ?", @(i)];
    NSAssert(rs, @"select failed: %@", [database lastErrorMessage]);
    if ([rs next]) {
        CFAbsoluteTime current = CFAbsoluteTimeGetCurrent();
        NSData *data = [rs dataForColumnIndex:0];
        NSLog(@"%lu %0.3f", (unsigned long)[data length], current - last);
        last = current;
    }
    [rs close];
}
2016-03-24 21:53:36.107 MyApp[3710:1262147] 1000000 0.010 2016-03-24 21:53:36.112 MyApp[3710:1262147] 1000000 0.004 2016-03-24 21:53:36.115 MyApp[3710:1262147] 1000000 0.004 2016-03-24 21:53:36.123 MyApp[3710:1262147] 1000000 0.008 2016-03-24 21:53:36.131 MyApp[3710:1262147] 1000000 0.008 2016-03-24 21:53:36.138 MyApp[3710:1262147] 1000000 0.007 2016-03-24 21:53:36.146 MyApp[3710:1262147] 1000000 0.007 2016-03-24 21:53:36.153 MyApp[3710:1262147] 1000000 0.007 2016-03-24 21:53:36.161 MyApp[3710:1262147] 1000000 0.007 2016-03-24 21:53:36.168 MyApp[3710:1262147] 1000000 0.007