持续快速的图像阵列

时间:2015-09-25 21:46:35

标签: arrays swift nsuserdefaults

我希望能够通过SwiftyUserDefaults保存包含UIImages的数组[{"dstCities": ["SF", "LA"], "dstState":"CA"}]

所需行为

以下是确切的预期行为:

  

通过SwiftyUserDefault库将一组UIImages保存到NSUserDefaults

     

稍后检索图像

代码这是一个非常少的代码

cardImages

错误

我收到以下错误:

  

尝试设置非属性列表对象(       ",{300,300}"   )作为关键图像的NSUserDefaults / CFPreferences值   ***由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:'尝试插入非属性列表对象(       ",{300,300}"   )关键图像'

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

UIImage不是这些,因此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

答案 1 :(得分:2)

实际上错误消息是清楚的。 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)
         }
     }
 }