【问题标题】:CoreData : store images to DB or not?CoreData:是否将图像存储到数据库?
【发布时间】:2011-02-04 02:37:55
【问题描述】:

我正在制作一个应用程序,它从网站上为某些用户名拍摄照片,并在带有用户名的 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];
}

【问题讨论】:

    标签: iphone image core-data


    【解决方案1】:

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

    二、二进制数据的存储规则是:

    • 1mb 存储在磁盘上并在 Core Data 中引用它

    更新

    Core Data 内部的存储应该是二进制的,您可以为其编写访问器方法。看看这个答案:Core data images from desktop to iphone

    更新

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

    【讨论】:

    • 感谢您的建议,但在表中我必须使用哪种数据类型?二进制?还是Nsstring?转换成jpeg有什么方法吗?
    • 在你的线程中我无法理解我必须使用这个函数来创建新类?或者只是在我的 UIView 中?
    • Marcus,你说以 PNG/JPEG 格式存储而不是 NSData。如果您有UIImage,您将如何在不使用UIImagePNGRepresentation(生成NSData 对象)之类的东西的情况下将PNG 存储在数据库中?
    • 第二,虽然我同意使用基于大小的基本阈值来确定您在数据库中存储的内容(因为它确实是逻辑位置)与您在Documents 中存储的内容的概念(这不太优雅,但提供了严重的性能优势),我会提倡不同的阈值。我个人的指导方针是,缩略图在数据库中是可以的,但任何大于 100kb 的东西最好存储在数据库之外。对于单个图像,您不会注意到它,但在呈现包含大量图像的 tableview/gallery 时,Documents快得多
    • NSData 是您要存储的内容,是的,您可以从 UIImagePNGRepresentation 获得它。这些阈值由 Apple 的核心数据团队推荐。它们不是我想出的数字。
    【解决方案2】:

    您可以简单地将UIImage 对象直接存储在CoreData 中,只需使用Transformable 数据类型,即可开始使用

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 2010-12-27
      • 2020-03-03
      • 2014-04-18
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2018-09-25
      相关资源
      最近更新 更多