斯威夫特 - 保存图像交替
我需要找到这种方法的替代保存图像斯威夫特 - 保存图像交替
let save = UserDefaults.standard
let imageData = UIImageJPEGRepresentation(Photo.image!, 1.0)
save.set(imageData, forKey: "Image")
save.synchronize()
if let imgData = save.object(forKey: "Image"){
let compressedJPGImage = UIImage(data: imgData as! Data)
}
和负载图像
let imgData = save.object(forKey: "Image")
let compressedJPGImage = UIImage(data: imgData as! Data)
Photo.image = compressedJPGImage
这种方法的问题是,我有很多与UserDefaults.standard
一起保存的另一个值,因此当我同步时需要很长时间(5-10分钟)。
建议不要将大图像保存为UserDefaults。 UserDefaults旨在保存非常小的数据,例如用户首选的应用程序主题颜色。也许一个合适的选择是将你的图像保存在文档目录中。这里是一个功能,可以让你保存图像:
func saveImage(image: UIImage) -> String {
let imageData = NSData(data: UIImagePNGRepresentation(image)!)
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
let docs = paths[0] as NSString
let uuid = NSUUID().uuidString + ".png"
let fullPath = docs.appendingPathComponent(uuid)
_ = imageData.write(toFile: fullPath, atomically: true)
return uuid
}
上述功能将为您创建保存图像的名称。如果你喜欢指定要节省那么你可以做下面的图像的名称(但你将负责确保您指定的图像名称是唯一的):
func saveImage(image: UIImage, withName name: String) {
let imageData = NSData(data: UIImagePNGRepresentation(image)!)
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
let docs = paths[0] as NSString
let name = name
let fullPath = docs.appendingPathComponent(name)
_ = imageData.write(toFile: fullPath, atomically: true)
}
来检索这些图像,就可以图像名称传递给该函数:
func getImage(imageName: String) -> UIImage? {
var savedImage: UIImage?
if let imagePath = getFilePath(fileName: imageName) {
savedImage = UIImage(contentsOfFile: imagePath)
}
else {
savedImage = nil
}
return savedImage
}
依赖于该功能的工作:
func getFilePath(fileName: String) -> String? {
let nsDocumentDirectory = FileManager.SearchPathDirectory.documentDirectory
let nsUserDomainMask = FileManager.SearchPathDomainMask.userDomainMask
var filePath: String?
let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true)
if paths.count > 0 {
let dirPath = paths[0] as NSString
filePath = dirPath.appendingPathComponent(fileName)
}
else {
filePath = nil
}
return filePath
}
这里是你将如何现在保存图像代替邻为例f UserDefaults。我保存图像我会打电话给“图片”:
saveImage(image: Photo.image, withName name: "Image")
下面是我如何检索保存图像时的例子:
if let theSavedImage = getImage(imageName: "Image") {
//I got the image
}
UserDefaults
是存储数据的一小部分的地方像用户喜好。 UserDefaults
有非常有限的空间,可以很慢。在你的情况,你提到它是5-10分钟,但我怀疑。
如果您希望图像跨应用程序的会话(持久存储)存储,则应考虑使用文件系统(Application_Folder/Library/Cache /)或Core Data框架。在访问图像时,您会获得更好的性能。
如果图像不需要保存并需要为应用的单个会话存储,则应该使用UIImage
类的imageNamed:
API。该API将图像加载到内存中并保存在系统缓存中。对于所有的连续访问,它只涉及缓存的图像。如果加载太多图像,这将增加系统缓存大小和应用程序的内存占用量。另一个API是imageWithContentsOfFile:
。与第一个API不同,此API将始终将新图像实例加载到内存中。一旦图像实例被释放,内存将被释放,而第一个API并非如此。
首先,'UserDefaults'是你应该存放大文件的最后一个地方。其次,'synchronize()'大多是无意义的。第三,你可能想使用'CoreData'来存储图像/数据 –
为什么你需要将它保存在UserDefaults中?这不是UserDefaults应该使用的。 – totiG
@ Mr.Xcoder如何使用CoreData保存和加载图像? – Rombond