【发布时间】:2016-07-12 05:42:46
【问题描述】:
我们有一个 sqlite 数据库,我们的 iOS 应用程序将图像存储在 blob 列中。 我们使用 FMDB 将 blob 读取为 NSData,然后转换为 UIImage。代码如下所示。
-(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;
}
上面这个方法的调用者接收到图像然后调整它的大小。 在上面这个方法的调用者中,我有一些代码来计时获取和调整部分代码的时间,我在调试控制台中收到了以下输出...
23:31:17.084 在 4.208354 秒内获得图像
23:31:17.086 在 0.001961 秒内调整大小的图像
23:31:17.115 在 0.028943 秒内获得图像
23:31:17.117 在 0.001891 秒内调整大小的图像
23:31:17.131 在 0.013373 秒内获得图像
23:31:17.133 在 0.002036 秒内调整大小的图像
23:31:17.844 在 0.711072 秒内获得图像
23:31:17.846 调整大小的图像在 0.001634 秒内
23:31:17.880 在 0.034076 秒内获得图像
23:31:17.882 在 0.001678 秒内调整大小的图像
23:31:17.910 在 0.028255 秒内获得图像
23:31:17.912 在 0.001652 秒内调整大小的图像
23:31:17.943 在 0.031323 秒内获得图像
23:31:17.945 调整大小的图像在 0.001783 秒内
23:31:17.954 在 0.009396 秒内获得图像
23:31:17.956 调整大小的图像在 0.001982 秒内
23:31:17.986 在 0.029724 秒内获得图像
23:31:17.988 在 0.001977 秒内调整大小的图像
23:31:18.026 在 0.037283 秒内获得图像
23:31:18.027 调整大小的图像在 0.001837 秒内
23:31:18.051 在 0.023700 秒内获得图像
23:31:18.053 在 0.001947 秒内调整大小的图像
23:31:18.088 在 0.035087 秒内获得图像
23:31:18.090 在 0.001687 秒内调整大小的图像
23:31:18.136 0.045304 秒获取图像
请注意,获取第一张图像需要 4.2 秒,而随后的所有图像仅用了百分之一秒。
有什么方法可以让我“启动泵”,可以说让这 4.2 秒的时间消失,并让数据库准备好像处理随后的所有图像一样运行。理想情况下,将 4 秒延迟隐藏在某个后台线程上会很棒,这样用户就不必在应用程序的其他点体验它,只需将最初的 4 秒移动到其他地方即可。
谢谢。
【问题讨论】:
-
我知道它与您的问题无关。然而,为什么不将“图像”保存在应用程序目录中并将该本地路径保存在数据库中。我认为这也是一个好主意,因为如果没有更多图像,那么您可能会遇到内存警告问题。
-
我不确定为什么会做出这样的设计选择。我不是该应用程序的原始开发人员。我只是在处理其中的一部分,因为它已移交给我们的团队。
-
检查第一个需要很长时间的图像大小。如果该图像很大,可能是原因,它将数据转换为图像需要 4 秒的时间。
-
您每次都在调用方法从数据库中获取数据并一次返回一张图像。可能您可以获得所有数据(DATA 数组),然后根据您的需要调整图像大小。而不是每次都调整大小,当你保存图像时,在那里调整大小并将调整大小的图像保存在数据库中。
-
所有图片尺寸相同... 640x480。我考虑过合并请求,但正如您所见,一旦完成第一个请求,其余的都很快。所以有些事情会在第一个请求时将数据库粘住。
标签: ios objective-c sqlite uiimage fmdb