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.")
    }