NSUserDefaults 无法检索图像数组
NSUserDefaults fail to retrieve image Array
我尝试存储 UIImage
的数组,它曾经可以工作,但不知何故突然无法工作。我写了这个测试示例来检查它是否正确存储,我想问题出在此处
let images = NSKeyedArchiver.archivedDataWithRootObject(self.globalImageArray)
NSUserDefaults.standardUserDefaults().setObject(images, forKey: "morningImages")
NSUserDefaults.standardUserDefaults().synchronize()
println("Images saved")
let images2 = NSUserDefaults.standardUserDefaults().objectForKey("morningImages") as? NSData
let imagesArray = NSKeyedUnarchiver.unarchiveObjectWithData(images2!) as! NSArray
var testArray = imagesArray as! [UIImage]
println("Check if images are loaded " + "\(testArray.count)")
testArray.count
等于零,这意味着它要么无法正确保存它们,要么无法检索它们。
我尝试打印 images2,它确实包含数据,但打印下一个值 imagesArray 导致结果等于“()”,我猜问题出在这一行:
let imagesArray = NSKeyedUnarchiver.unarchiveObjectWithData(images2!) as! NSArray
提前感谢您的帮助。
正如其他人指出的那样,这确实不是 NSUserDefaults 的最佳用例。这应该很简单,只需写入和读取磁盘上的文件即可。
这是我的做法,它比保存到 NSUserDefaults 的代码更少!
NSKeyedArchiver.archiveRootObject(self.globalImageArray, toFile: "/path/to/archive")
println("Images saved")
if let testArray = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as? [UIImage] {
println("Check if images are loaded " + "\(testArray.count)")
} else {
println("Failed to load images.")
}
EDIT 事实证明这对缓存图像不起作用(例如任何 UIImage
加载了 UIImage(named:)
变体,因为缓存图像似乎没有序列化到磁盘。因此,虽然以上适用于未缓存 UIImages
,但无论图像的缓存状态如何,以下都适用。
// Save the raw data of each image
if NSKeyedArchiver.archiveRootObject(imageArray.map { UIImagePNGRepresentation([=11=]) }, toFile: archivePath) {
println("\(imageArray.count) Images saved")
} else {
println("failed to save images")
}
// Load the raw data
if let dataArray = NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath) as? [NSData] {
// Transform the data items to UIImage items
let testArray = dataArray.map { UIImage(data: [=11=])! }
println("\(testArray.count) images loaded.")
} else {
println("Failed to load images.")
}
我尝试存储 UIImage
的数组,它曾经可以工作,但不知何故突然无法工作。我写了这个测试示例来检查它是否正确存储,我想问题出在此处
let images = NSKeyedArchiver.archivedDataWithRootObject(self.globalImageArray)
NSUserDefaults.standardUserDefaults().setObject(images, forKey: "morningImages")
NSUserDefaults.standardUserDefaults().synchronize()
println("Images saved")
let images2 = NSUserDefaults.standardUserDefaults().objectForKey("morningImages") as? NSData
let imagesArray = NSKeyedUnarchiver.unarchiveObjectWithData(images2!) as! NSArray
var testArray = imagesArray as! [UIImage]
println("Check if images are loaded " + "\(testArray.count)")
testArray.count
等于零,这意味着它要么无法正确保存它们,要么无法检索它们。
我尝试打印 images2,它确实包含数据,但打印下一个值 imagesArray 导致结果等于“()”,我猜问题出在这一行:
let imagesArray = NSKeyedUnarchiver.unarchiveObjectWithData(images2!) as! NSArray
提前感谢您的帮助。
正如其他人指出的那样,这确实不是 NSUserDefaults 的最佳用例。这应该很简单,只需写入和读取磁盘上的文件即可。
这是我的做法,它比保存到 NSUserDefaults 的代码更少!
NSKeyedArchiver.archiveRootObject(self.globalImageArray, toFile: "/path/to/archive")
println("Images saved")
if let testArray = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as? [UIImage] {
println("Check if images are loaded " + "\(testArray.count)")
} else {
println("Failed to load images.")
}
EDIT 事实证明这对缓存图像不起作用(例如任何 UIImage
加载了 UIImage(named:)
变体,因为缓存图像似乎没有序列化到磁盘。因此,虽然以上适用于未缓存 UIImages
,但无论图像的缓存状态如何,以下都适用。
// Save the raw data of each image
if NSKeyedArchiver.archiveRootObject(imageArray.map { UIImagePNGRepresentation([=11=]) }, toFile: archivePath) {
println("\(imageArray.count) Images saved")
} else {
println("failed to save images")
}
// Load the raw data
if let dataArray = NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath) as? [NSData] {
// Transform the data items to UIImage items
let testArray = dataArray.map { UIImage(data: [=11=])! }
println("\(testArray.count) images loaded.")
} else {
println("Failed to load images.")
}