我计划在我的应用中使用核心数据如果没有互联网连接。
所以我正在做的是从我的服务器中检索图像和视频。我目前从服务器检索到的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。
最佳解决方案和最快捷方式是什么?
感谢任何能提供一些建议的人。
答案 0 :(得分:2)
与大多数计算机一样,iOS设备具有持久存储。 (例如硬盘或ssd)
要在系统关闭事件等之间保留数据,您的应用可以使用文件系统将其直接保存到此存储。这是一种快速简单的数据存储方式。
如果您需要更结构化的方法,可以使用数据库。这种方法允许您以更有条理的方式处理数据(即行和列,关系等)。此数据库将存储在文件系统中,但您的应用程序将直接使用数据库文件本身
在iOS上,使用的典型数据库是SQLite。
核心数据是一个(或很少,多个)数据库之上的另一层。此方法允许您将数据集中在具有相互关系的实体上。 (例如User
- >多个Follower
等。)使用核心数据,您通常可以忽略数据库及其背后的文件系统。
在iOS上,核心数据通常使用一个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.")
}