Ios 使用磁盘中的映像数据填充阵列时崩溃
我正在将UIImage保存到磁盘:Ios 使用磁盘中的映像数据填充阵列时崩溃,ios,swift,uiimage,Ios,Swift,Uiimage,我正在将UIImage保存到磁盘: let sketchData: NSData = UIImagePNGRepresentation(sketch) let sketchPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Sketch\(indexNumber).png") sketchData.writeToFile(sketchPath, atomically: true) 然后,我尝试用它
let sketchData: NSData = UIImagePNGRepresentation(sketch)
let sketchPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Sketch\(indexNumber).png")
sketchData.writeToFile(sketchPath, atomically: true)
然后,我尝试用它们重新填充数组:
if lengthOfSketchArray > 0 {
for indexNumber in 0...lengthOfSketchArray {
let sketchPath: String = NSHomeDirectory().stringByAppendingPathComponent("Documents/Sketch\(indexNumber).png")
let image = UIImage(contentsOfFile: sketchPath)
slideSketchArray[indexNumber] = image!
}
}
在最后一行,我得到了“致命错误:在展开可选值时意外发现nil”
我尝试了很多变化,但都失败了。我做错了什么
更新 现在开始工作了!我根据评论做了很多改变,包括使用
NSSearchPathForDirectoriesInDomains
,并且不再将图像保存在阵列中。现在我正在保存映像路径,并在需要时从磁盘加载映像
func saveImageToDisk() {
let sketchData: NSData = UIImagePNGRepresentation(sketch)
let destinationFolder: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
let sketchPath: String = "\(destinationFolder)\(currentProjectID).png"
sketchData.writeToFile(sketchPath, atomically: true)
let currentMetadata: [String: String] = [
"sketchpath": sketchPath
]
allMetadata.append(currentMetadata)
defaults.setObject(allMetadata, forKey: "allMetadata")
func loadImageAtIndex(index: Int) -> UIImage {
let sketchPath: String = allMetadata[index].objectForKey("sketchpath") as String
let image = UIImage(contentsOfFile: sketchPath)
return image!
}
for循环中的“…”表示将lengthOfSketchArray作为迭代器的最后一个值。也许这就是它在最后一个值崩溃的原因,它超出了数组长度。您应该使用(lengthOfSteckArray-1)或。。而不是(我在斯威夫特的书中读到过,但我不是100%以上。)。无论如何,您应该先验证可选变量是否有值,然后再包装它以获取值。然后,使用NSSearchPathForDirectoriesInDomains检索文档文件夹的路径
var documentDir: String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
if lengthOfSketchArray > 0 {
for indexNumber in 0..lengthOfSketchArray {
let sketchPath: String = documentDir.stringByAppendingPathComponent("Sketch\(indexNumber).png")
let image = UIImage(contentsOfFile: sketchPath)
slideSketchArray[indexNumber] = image!
}
}
您正在使用0的“关闭”范围。。。lengthOfSketchArray
,它将包括零和lengthOfSketchArray
(即,您将重复此lengthOfSketchArray+1
次)。我认为您打算使用0..
的“半开放”范围,这将不包括lengthOfSketchArray
,即它将从零变为lengthOfSketchArray-1
:
let documentsFolder = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
for index in 0 ..< lengthOfSketchArray {
let path = documentsFolder.stringByAppendingPathComponent("Sketch\(index).png")
if let image = UIImage(contentsOfFile: path) {
slideSketchArray[index] = image
}
}
您能否记录循环的每次迭代并发布结果?您正在对0…lengthOfSketchArray中的indexNumber执行
。你是说。你不应该使用NSHomeDirectory
并附加到它来查找文档目录。相反,您应该使用NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)
或NSFileManager.URLsForDirectory(NSDocumentDirectory,domainMask:.UserDomainMask)
在iOS 8中,文档目录不再与应用程序目录位于同一位置。顺便说一句,范围更广(且不相关)问题是将图像加载到数组中是一种相当浪费内存的行为。我建议只在实际需要时从持久性存储中检索图像。如果您试图优化性能,您可以考虑使用<代码> nSCACHE//>(您将清除内存警告)而不是数组。请使用工作代码查看我的更新。我认为错误的文件路径是我最大的问题,虽然可能包括整个数组长度也会导致崩溃(但我不再用图像填充数组,所以这是没有意义的)。看起来我的主要问题是文件路径错误,所以实际上在我尝试加载的位置没有图像。
var slideSketchArray = [UIImage]()