2017-06-19 55 views
2


我需要找到这种方法的替代保存图像斯威夫特 - 保存图像交替

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分钟)。

+1

首先,'UserDefaults'是你应该存放大文件的最后一个地方。其次,'synchronize()'大多是无意义的。第三,你可能想使用'CoreData'来存储图像/数据 –

+0

为什么你需要将它保存在UserDefaults中?这不是UserDefaults应该使用的。 – totiG

+0

@ Mr.Xcoder如何使用CoreData保存和加载图像? – Rombond

回答

3

建议不要将大图像保存为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 
    } 
+0

谢谢@gwinyai你的方法是惊人的,但我有一个问题^^当我得到我的形象回来它转90度左,你知道为什么吗? – Rombond

+0

是的,我之前遇到过这个问题,但由于某种原因,我不记得修复。你可以尝试用UIImageJPEGRepresentation将图像保存为JPEG格式,然后尝试一下。我给你的功能保存为带有UIImagePNGRepresentation的PNG。我只需要一些记住关于这个问题的一些细节。 – gwinyai

+1

@Rombond PNG不保存任何方向。在保存之前,您需要重新绘制图像。 –

0

UserDefaults是存储数据的一小部分的地方像用户喜好。 UserDefaults有非常有限的空间,可以很慢。在你的情况,你提到它是5-10分钟,但我怀疑。

如果您希望图像跨应用程序的会话(持久存储)存储,则应考虑使用文件系统(Application_Folder/Library/Cache /)或Core Data框架。在访问图像时,您会获得更好的性能。

如果图像不需要保存并需要为应用的单个会话存储,则应该使用UIImage类的imageNamed: API。该API将图像加载到内存中并保存在系统缓存中。对于所有的连续访问,它只涉及缓存的图像。如果加载太多图像,这将增加系统缓存大小和应用程序的内存占用量。另一个API是imageWithContentsOfFile:。与第一个API不同,此API将始终将新图像实例加载到内存中。一旦图像实例被释放,内存将被释放,而第一个API并非如此。