CoreData:将图像存储到数据库中还是不存储?

24

我正在开发一个应用程序,它从网站中获取某个用户名的照片,并在UITable中显示该用户名,然后单击用户名时会显示此用户的照片,再单击照片名称时会显示全屏照片。

我的问题是,我使用NSData从互联网上获取照片。我是否需要将数据保存到CoreData中?当按下用户名时,它会创建NSData并从互联网下载照片并在UITable上显示它们。这需要时间。

什么是好的方法?如何将这些图像保存到CoreData中?

我正在使用这种方法:

NSData *imageData=[flickr dataForPhotoID:firstPhoto.id fromFarm:firstPhoto.farm 
onServer:firstPhoto.server withSecret:firstPhoto.secret inFormat: 
FlickrFetcherPhotoFormatSquare];

这里是 dataForPhotoID 方法的定义

- (NSData *)dataForPhotoID:(NSString *)photoID fromFarm:(NSString *)farm   
   onServer:(NSString *)server withSecret:(NSString *)secret 
 inFormat:(FlickrFetcherPhotoFormat)format {

#if TEST_HIGH_NETWORK_LATENCY
sleep(1);
#endif

NSString *formatString;

switch (format) {
    case FlickrFetcherPhotoFormatSquare:    formatString = @"s"; break;
    case FlickrFetcherPhotoFormatLarge:     formatString = @"b"; break;
}

NSString *photoURLString = [NSString stringWithFormat:@"http://farm%@.static.flickr.com/%@/%@_%@_%@.jpg", farm, server, photoID, secret, formatString];
NSURL *url = [NSURL URLWithString:photoURLString];

return [NSData dataWithContentsOfURL:url];
}
2个回答

56

首先,始终将图像以可用格式(如PNG或JPEG)存储,而不是使用NSData。这将为您节省许多麻烦。

其次,存储二进制数据的规则是:

  • < 100kb:将其存储在与相关数据相同的表中
  • < 1mb:存储在单独的表中并通过关系连接以避免不必要的加载
  • > 1mb:存储在磁盘上,并在Core Data中引用它

更新

在Core Data中,存储应该是二进制的,您可以编写访问方法来实现转换。请查看此答案:Core data images from desktop to iphone

更新

我链接的示例代码描述了如何在NSManagedObject子类中创建访问器,以在UIImage和二进制数据之间进行转换。


谢谢您的建议,但在表格中我应该使用哪种数据类型?二进制?还是NSString?将其转换为JPEG格式有什么方法吗? - Ercan
在你的线程中,我不明白我必须要创建一个新类来使用这些函数吗?还是直接在我的UIView中使用? - Ercan
2
Marcus,你说要以PNG/JPEG格式存储,而不是使用NSData。如果你有一个UIImage,你如何在不使用像UIImagePNGRepresentation这样生成NSData对象的情况下将PNG存储到数据库中? - Rob
1
其次,虽然我同意使用基于大小的阈值来确定存储在数据库中的内容(因为它确实是逻辑上的最佳位置)与存储在“文档”中的内容(这不太优雅,但提供了严重的性能优势),但我会主张采用不同的阈值。我的个人指南是缩略图图像可以存储在数据库中,但任何大于100kb的图像最好存储在数据库之外。单个图像不会注意到它,但当呈现带有大量图像的表格视图/画廊时,“文档”速度要快得多。 - Rob
太棒了的回答。谢谢马库斯! - jpm
显示剩余2条评论

1
你可以直接在CoreData中存储UIImage对象,只需使用Transformable数据类型即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接