CoreData:将图像存储到DB还是不存储?

Erc*_*can 24 iphone image core-data

我正在制作一个应用程序,从网站上获取一些用户名的照片,并在用户名的UITable中显示,然后点击用户名,它显示该用户的照片,然后点击它显示全屏照片的照片名称.

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

什么是好方法?以及如何将此图像保存到CoreData?

我正在使用这种方法

NSData *imageData=[flickr dataForPhotoID:firstPhoto.id fromFarm:firstPhoto.farm 
onServer:firstPhoto.server withSecret:firstPhoto.secret inFormat: 
FlickrFetcherPhotoFormatSquare];
Run Code Online (Sandbox Code Playgroud)

这里定义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];
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*rra 55

首先,始终以PNG或JPEG等可用格式存储图像,而不是NSData.这将为您节省很多麻烦.

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

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

更新

Core Data中的存储应该是二进制的,您可以为它编写访问器方法.看看这个答案:从桌面到iphone的核心数据图像

更新

我链接的示例代码描述了如何在NSManagedObject子类中创建访问器,它将在UIImage和二进制数据之间来回转换图像.

  • Marcus,你说用PNG/JPEG格式存储而不是`NSData`.如果你有一个`UIImage`,那么如何在不使用像`UIImagePNGRepresentation`(生成`NSData`对象)这样的东西的情况下将PNG存储在数据库中? (2认同)