保留图像数组 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是
- 一个字符串(
String
或 NSString
),
- 一个
NSData
,
- 一个日期 (
NSDate
),
- 一个数字 (
NSNumber
),
- 一个布尔值(也
NSNumber
),
- 属性 个列表数组,
- 或者键为字符串且值为 属性 列表的字典。
UIImage
是其中的 none,因此 UIImage
不是 属性 列表,也不能是 属性 列表的一部分。
您需要将图像转换为 NSData
以将其存储在用户默认值中。由于 UIImage
除了原始像素数据外还包含一些属性(如 scale
和 imageOrientation
),因此将 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)
}
}
}
我希望能够通过 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是
- 一个字符串(
String
或NSString
), - 一个
NSData
, - 一个日期 (
NSDate
), - 一个数字 (
NSNumber
), - 一个布尔值(也
NSNumber
), - 属性 个列表数组,
- 或者键为字符串且值为 属性 列表的字典。
UIImage
是其中的 none,因此 UIImage
不是 属性 列表,也不能是 属性 列表的一部分。
您需要将图像转换为 NSData
以将其存储在用户默认值中。由于 UIImage
除了原始像素数据外还包含一些属性(如 scale
和 imageOrientation
),因此将 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)
}
}
}