保留图像数组 Swift

Persist Array of Images Swift

我希望能够通过 SwiftyUserDefaults.

保存包含 UIImage 的数组 cardImages

期望的行为

这里是确切的期望行为:

Save an array of UIImages to NSUserDefaults via the SwiftyUserDefault library

Retrieve the images later

代码 这被精简为非常少的代码

    var newPhotoKey = DefaultsKey<NSArray>("image")//Setting up the SwiftyUserDefaults Persisted Array

        cardImages = [(UIImage(named: "MyImageName.jpg")!)] //This array contains the default value, and will fill up with more
        Defaults[theKeyForStoringThisArray] = cardImages //This is the persisted array in which the array full of images should be stored. WHERE THE ERROR HAPPENS

var arrayToRetreiveWith = Defaults[theKeyForStoringThisArray] as! [UIImage] //To Retreive

错误

我收到以下错误:

Attempt to set a non-property-list object ( ", {300, 300}" ) as an NSUserDefaults/CFPreferences value for key image *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object ( ", {300, 300}" ) for key image'

谢谢!

用户默认值必须是一个属性列表。一个property list

  • 一个字符串(StringNSString),
  • 一个NSData,
  • 一个日期 (NSDate),
  • 一个数字 (NSNumber),
  • 一个布尔值(也 NSNumber),
  • 属性 个列表数组,
  • 或者键为字符串且值为 属性 列表的字典。

UIImage 是其中的 none,因此 UIImage 不是 属性 列表,也不能是 属性 列表的一部分。

您需要将图像转换为 NSData 以将其存储在用户默认值中。由于 UIImage 除了原始像素数据外还包含一些属性(如 scaleimageOrientation),因此将 UIImage 转换为 NSData 的最简单方法是creating an archive:

没有损失
let cardImage: UIImage? = someImage()
let cardImageArchive: NSData = NSKeyedArchiver.archivedDataWithRootObject(cardImage!)

现在您可以将 cardImageArchive 存储在更大的 属性 列表中,您可以将其存储为用户默认值。

稍后,当您需要从数据中重新创建图像时,请执行以下操作:

let cardImageArchive: NSData = dataFromUserDefaults()
let cardImage: UIImage = NSKeyedUnarchiver.unarchiveObjectWithData(cardImageArchive) as! UIImage

错误信息其实很清楚。 UIImage 不是属性列表,因此您需要先将其更改为行数据。我将在下面给出示例,但仅供参考,真的不建议使用 NSUserDefaults 保存图像等大数据。我会使用 NSFileManager 并将其放在用户文档目录中。无论如何

var newPhotoKey = DefaultsKey<NSArray>("image")
cardImages = [(UIImage(named: "MyImageName.jpg")!)] 
var cardImagesRowdataArray: NSData = []
for image in cardImages {
    let imageData = UIImageJPEGRepresentation(image, 1.0)
    cardImagesRowdataArray.append(imageData)
}
Defaults[theKeyForStoringThisArray] = cardImagesRowdataArray 

var arrayToRetreiveWith = Defaults[theKeyForStoringThisArray] as! [NSData]
// here you can use UIImage(data: data) to get it back

如果你不坚持使用SwiftyUserDefaults,可以将它保存在用户文档目录下,这里是如何操作

func saveImage(image: UIImage){
    if let imageData = UIImageJPEGRepresentation(image, 1.0) {
         let manager = NSFileManager()
         if let docUrl = manager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first{
             let uniqueName = NSDate.timeIntervalSinceReferenceDate()
             let url = docUrl.URLByAppendingPathComponent("\(uniqueName).jpg")
             imageData.writeToURL(url, atomically: true)
         }
     }
 }