简体   繁体   English

使用UserDefaults保存图像数组

[英]Saving an image array with UserDefaults

I have an app where the user takes a picture and once the picture is taken it should be saved to UserDefaults . 我有一个应用程序,用户拍照,一旦拍照,它应保存到UserDefaults I keep getting this error: 我一直收到这个错误:

"cannot invoke 'setObject' with an argument list of type '(UIImage. type, forKey:[UIImage])'"

I've searched through documentation and posts on here, but nothing helps. 我在这里搜索了文档和帖子,但没有任何帮助。 This is my code. 这是我的代码。

let defaults = NSUserDefaults.standardUserDefaults()

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {

    picker.dismissViewControllerAnimated(true, completion: nil)

    switch currentClothesSelection!{

        case "1":
            shirts.append(info[UIImagePickerControllerOriginalImage] as! UIImage)

            //this is where the error occurs
            defaults.setObject(UIImage.self, forKey: array1)

        case "2" :
            pants.append(info[UIImagePickerControllerOriginalImage] as! UIImage)
        case "3" :
            shorts.append(info[UIImagePickerControllerOriginalImage] as! UIImage)
        case "4" :
            jackets.append(info[UIImagePickerControllerOriginalImage] as! UIImage)
        case "5" :
            shoes.append(info[UIImagePickerControllerOriginalImage] as! UIImage)

        default:
         break
    }

edit/update: 编辑/更新:

Xcode 10.1 • Swift 4.2.1 or later Xcode 10.1•Swift 4.2.1或更高版本

It is not a good idea to store images at NSUserDefaults but if you really want to do it you need to store is as NSData. 在NSUserDefaults存储图像不是一个好主意,但如果你真的想这样做,你需要存储为NSData。

The value parameter can be only property list objects: NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. value参数只能是属性列表对象:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。 For NSArray and NSDictionary objects, their contents must be property list objects 对于NSArray和NSDictionary对象,其内容必须是属性列表对象

I recommend saving it locally to disk at the Documents Folder. 我建议将它本地保存到Documents文件夹中的磁盘。 If you really want to save it to NSUserDefaults, I recommend using just for small images and do it at your own risk :) You can do as follow: 如果你真的想把它保存到NSUserDefaults,我建议只使用小图片并自行承担风险:)你可以这样做:

extension UserDefaults {
    func set(image: UIImage?, quality: CGFloat = 0.5, forKey defaultName: String) {
        guard let image = image else {
            set(nil, forKey: defaultName)
            return
        }
        set(image.jpegData(compressionQuality: quality), forKey: defaultName)
    }
    func image(forKey defaultName:String) -> UIImage? {
        guard
            let data = data(forKey: defaultName),
            let image = UIImage(data: data)
        else  { return nil }
        return image
    }
    func set(images value: [UIImage]?, forKey defaultName: String) throws {
        guard let value = value else {
            removeObject(forKey: defaultName)
            return
        }
        try set(NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: false), forKey: defaultName)
    }
    func images(forKey defaultName: String) throws -> [UIImage] {
        guard let data = data(forKey: defaultName) else { return [] }

        let object = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
        return object as? [UIImage] ?? []
    }
}

Testing: 测试:

let image = UIImage(data: try! Data(contentsOf: URL(string: "https://i.stack.imgur.com/Xs4RX.jpg")!))!
UserDefaults.standard.set(image: image, forKey: "imageKey")
if let loadedImage = UserDefaults.standard.image(forKey: "imageKey") {
    print(loadedImage.size)  // "(719.0, 808.0)"
}

let images = [image, image]
try? UserDefaults.standard.set(images: images, forKey: "imagesKey")
if let loadedImages = try? UserDefaults.standard.images(forKey: "imagesKey") {
    print(loadedImages.count)  // 2
}

Saving blob data in NSUserDefaults will result a huge performance penalty for you app. 在NSUserDefaults中保存blob数据将对您的应用程序造成巨大的性能损失。 You have two options: 您有两种选择:

  1. Save image in cache folder as a file and use NSUserDefaults to store their path 将图像作为文件保存在缓存文件夹中,并使用NSUserDefaults存储其路径
  2. Use CoreData, SQLite or Realm databases to store images. 使用CoreData,SQLite或Realm数据库来存储图像。 Data structure of your data will determine which one is more appropriate. 数据的数据结构将决定哪一个更合适。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM