使NSManagedObject可编码并存储图像数据

时间:2018-09-11 22:42:05

标签: ios json swift image-processing core-data

我正在开发具有离线功能的应用程序。我必须从网络中获取JSON数据并将其存储在Core Data中。其余数据很简单,但是我想知道什么是处理图像的最佳方法。 JSON响应提供了URL,然后我必须下载图像并将图像数据存储到Core Data中。我正在制作NSManagedObject Codable,因此可以捕获该URL。我有额外的可选变量 albumImage与数据。这是正确的方法吗?我将使用albumArtwork存储URL,我将使用该URL下载图像并将数据存储到albumImage中。此模型中albumImage的唯一目的是存储图像数据,而不处理JSON响应。我只想知道是否有更好的方法来处理这个问题。

JSON:

{
                "artistName": "Ozuna",
                "id": "1433976640",
                "releaseDate": "2018-08-24",
                "name": "Aura",
                "kind": "album",
                "copyright": "℗ 2018 VP Records Corp./Dimelo Vi Dist. by Sony Music Entertainment U.S. Latin LLC",
                "artistId": "283578837",
                "artistUrl": "https://itunes.apple.com/us/artist/ozuna/283578837?app=music",
                "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Music128/v4/d7/60/f7/d760f7bf-e2bc-e48e-afcd-b9b562ad4c2f/697691884080.jpg/200x200bb.png"
}

用于处理JSON响应的模型:

public class Album: NSManagedObject, Codable {
    @NSManaged public var artistName: String
    @NSManaged public var albumName: String
    @NSManaged public var copyrightInfo: String
    @NSManaged public var albumArtwork: String
    @NSManaged public var albumReleaseDate: Date
    @NSManaged public var linkToAppStore: String
    @NSManaged public var albumImage: NSData?
}

2 个答案:

答案 0 :(得分:1)

建议不要使用存储图像数据的麻烦,而建议使用SDWebImage并将URL中的URL仅存储为 URI

import SDWebImage
imageView.sd_setImage(with:url, placeholderImage: UIImage(named: "placeholder.png"))

利用下载和缓存

答案 1 :(得分:1)

在CoreData中将数据blob与在磁盘上作为单独的文件存储是有优缺点的。存储在文件中意味着您必须跟踪它们并在删除或更改它们时正确清理它们,这有点麻烦。

在您的情况下,我只将数据直接存储在CoreData中,但是使用单独的CoreData对象(例如AlbumImage),该对象与Album对象具有一对一的关系。当您仅使用“相册”对象并且不希望将图像数据加载到内存中时,这可以使事情保持快速。

CoreData还具有“允许外部存储”选项,该选项实际上无论如何都会将数据存储为磁盘上的文件(一旦达到特定大小阈值),因此您也可以尝试。

-

关于您的评论。

如果您有一个AlbumVC列出相册,您可以在其中排序/搜索/过滤,那么将不必要地使用大量内存将所有全尺寸图像数据存储在内存中。如果您有辅助对象,则仅在用户深入到AlbumDetailVC时才需要将其加载到内存中。

您仍然可以保留相同的接口来访问图像,只是让该方法调用子对象。像这样的东西。

- (UIImage *)image
{
    return [UIImage imageWithData:self.imageData.data];
}