【问题标题】:Making NSManagedObject Codable and Store Image Data使 NSManagedObject 可编码并存储图像数据
【发布时间】:2019-02-16 11:59:32
【问题描述】:

我正在开发具有离线功能的应用程序。我必须从网络中获取 JSON 数据并将其存储在 Core Data 中。其余数据非常简单,但我想知道处理图像的最佳方法是什么。 JSON 响应给出了 URL,然后我必须下载图像并将图像的数据存储到 Core Data 中。我正在使 NSManagedObject 可编码,因此我可以捕获该 URL。我有额外的可选变量 albumImage 有数据。这是正确的方法吗?我会使用albumArtwork 来存储URL,我会使用该URL 来下载图像并将数据存储到albumImagealbumImage 在此模型中的唯一目的是存储图像数据,而不是处理 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?
}

【问题讨论】:

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


    【解决方案1】:

    将数据 blob 存储在 CoreData 和磁盘上作为单独的文件各有利弊。存储在文件中意味着您必须跟踪它们并在它们被删除或更改时正确清理,这有点痛苦。

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

    CoreData 还具有“允许外部存储”选项,该选项实际上会将数据作为文件存储在磁盘上(一旦满足特定大小阈值),因此您也可以尝试。

    -

    关于你的 cmets。

    如果您有一个AlbumVC 列出可以排序/搜索/过滤的相册,那么将所有完整大小的图像数据都放在内存中是不必要的。如果你有一个次要对象,那么它只需要在用户深入到AlbumDetailVC 时加载到内存中。

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

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

    【讨论】:

    • 这些都是非常好的观点。不过,只有一个后续问题。我想我想将图像数据与每个专辑对象相关联。这就是为什么我将专辑图像作为专辑对象的一部分。您是否可以给我一个示例或用例,将它放在一个单独的实体中会有所帮助?
    【解决方案2】:

    我建议您使用SDWebImage并将CoreData中的url仅存储为URI

    ,而不是为存储图像数据而烦恼
    import SDWebImage
    imageView.sd_setImage(with:url, placeholderImage: UIImage(named: "placeholder.png"))
    

    利用下载和缓存

    【讨论】:

    • 这样的话,我该如何获得离线访问呢?我相信如果我将 URL 存储在 Core Data 中并且没有网络连接,我将无法使用 SDWebImage。正确的?我想存储图像以供离线使用。
    • @VandanPatel ,如果图片缓存在 sdwebimage 中,那么它将以离线模式显示
    猜你喜欢
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2011-07-11
    • 2016-09-18
    • 2012-06-09
    • 1970-01-01
    • 2021-02-18
    相关资源
    最近更新 更多