Swift - 保存到核心数据

Posted

技术标签:

【中文标题】Swift - 保存到核心数据【英文标题】:Swift - Saving to Core Data 【发布时间】:2016-11-23 18:20:36 【问题描述】:

如果没有互联网连接,我计划在我的应用中使用 Core Data。

所以我正在做的是从我的服务器中检索 图像视频。我目前从从服务器检索到的 url 下载它们(例如图像)并将其转换为 UIImage NSData,然后填充我的 tableView。

现在到 CoreData:

有些人可能会说在 coreData 中存储文件是个坏主意,但由于我一次最多只能存储 5 个图像/视频,所以我不认为存储或速度会成为问题,因为它们不会是大量文件。

问题:

我必须将 UIImage 保存到 CoreData,所以显然我需要获取 URL 然后下载图像并最终将其保存到 coreData。

但是,如果我在查询中这样做以获取可能会减慢查询速度的实际帖子几秒钟,我宁愿不这样做。 所以我想知道最好的方法是什么?

每次出现单元格时,我都会与 SDWebImage 异步下载图像,因此如果我将图像保存到 coreData 一旦下载,这意味着将 5 个图像保存到 CoreData,我需要滚动 5 个单元格。

但我更愿意:加载应用程序,像往常一样从服务器下载图像/视频并填充 tableView,一旦所有这些都发生了,我希望帖子已经保存到 coreData。

因此,如果我在填充 tableView 后立即关闭应用程序,然后断开互联网连接或进入 AirPlane 模式并重新打开应用程序,我在 tableView 中有帖子。

我知道如何将大部分数据保存到 coreData 等...但我想要一些更专业的建议和技巧来说明我应该如何处理这个问题。

我想达到什么目标?

1) 打开应用程序

2) 从服务器下载 5 张图片/视频(这里也很好)

(从这里开始,我想要一些建议)

3) 如果之前保存了任何图像/视频,则清空 coreData

4) 将我最近下载的 5 个图像/视频保存到 CoreData。

最好的解决方案和最快的方法是什么?

感谢任何可以提供建议的人。

【问题讨论】:

在 Core Data 中存储二进制文件(我相信)是可行的。但是,我很好奇为什么您认为有必要将文件存储在 Core Data 中而不是文件系统中?您的问题似乎与它们在表格视图中的显示有关,而不是与存储方法相关的任何问题。存储到文件系统将非常简单,并且可以满足您列出的要求。 @AnthonyC 文件系统,没听说过...我只是想知道以最快的方式将数据保存到 coreData 或文件系统的最佳方法是什么...如果有的话,还可以删除和添加更多那里已经有数据了... 【参考方案1】:

背景

ios 设备与大多数计算机一样,具有持久存储。 (例如硬盘驱动器或 ssd)

要跨系统关闭事件等保存数据,您的应用可以使用文件系统将其直接保存到此存储中。这是一种快速而简单的数据存储方式。

如果您需要更结构化的方法,您可以使用数据库。这种方法允许您以更有条理的方式处理数据(即以行和列、关系等方式)。该数据库将存储在文件系统中,但您的应用程序将直接使用数据库文件本身.

在 iOS 上,使用的典型数据库是 SQLite。

核心数据是一个(或很少,多个)数据库之上的另一层。这种方法使您可以将数据作为相互关联的实体来关注。 (例如User -> 多个Follower 等)使用Core Data,您通常可以忽略数据库及其底层的文件系统。

在 iOS 上,Core Data 通常使用一个 SQLite 数据库作为存储来实现。

您的用例

如果您只需要将一些图像或视频存储到您的设备,那么直接存储到文件系统可以很好地工作。

假设您已经有了文件,您只需要:

1 – 获取目录位置

var documentDirectoryUrl: URL do try documentDirectoryUrl = FileManager.default.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let imageUrl = documentDirectoryUrl.appendingPathComponent("imageFileName.jpg") catch // error handling

2 – 将文件写入磁盘

if (try? imageData.write(to: imageUrl)) == nil // nil == false print("Error: could not save image to file system.")

参考

iOS File System Core Data SQLite on iOS Tutorial

【讨论】:

感谢您的回答。那么使用文件系统而不是coreData有什么好处吗?另外关于我已经有了文件,我正在下载它,但我下载的是图像的 url,然后在单元格出现时从 url 下载图像。现在我正在寻找一种方法来获取图像而不显示单元格并保存到核心数据而不会花费太多时间 这两种方式各有利弊。就个人而言,对于只有五张图像,我会直接存储到磁盘,因为它既快速又简单。 (这里有几个讨论:1、2。) 至于如何在不显示单元格的情况下保存图像......这是一个编码问题。我不知道为什么你很难跳过将其显示到单元格的代码。也许发布另一个问题,显示您的表格视图和图像检索代码。 嗯,我现在实际上有一种方法,我从服务器查询所有帖子,在同一个查询中,我下载所有图像并将它们保存到 coreData,但查询时间为 2-3 秒而不是大约 1 秒...我正在尝试解决该问题,如果您想查看一些有关我如何操作的代码,我可以向您展示!我现在将看看这些讨论。无论如何都要 +1 我已经开始按照您的建议进行操作,将其保存到磁盘并在 CoreData 中链接。完成后我将分享我的一些 sloution,如果您可以在需要时给我一些建议或提示,我将不胜感激!无论如何都接受!

以上是关于Swift - 保存到核心数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 2 中将 UITextField 保存到核心数据?

Swift - 保存到核心数据

核心数据检查是不是已经保存,Swift

尝试从响应 Swift Alamofire 将数据保存到核心数据时崩溃

如何使用 1 个函数将 2 个属性保存到核心数据(Swift4)

如何在核心数据swift 3中同时保存和获取