2015-02-11 59 views
0

填充图像数据阵列时,我节省UIImages磁盘:崩溃从磁盘

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! 
     } 
    } 

在最后行,我得到“致命的错误:意外地发现零,同时解开一个可选值”。

我试了很多变化,但每一个崩溃。我究竟做错了什么?


UPDATE

它的工作吧!我根据评论改变了很多东西,包括使用 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! 
} 
+0

你可以在循环的每次迭代中记录'sketchPath'并发布结果吗? – NobodyNada 2015-02-11 23:23:09

+1

您正在执行'for indexNumber in 0 ... lengthOfSketchArray'。你的意思是......“而不是”......“? – Rob 2015-02-11 23:24:27

+2

您不应该使用'NSHomeDirectory'并追加到它来查找文档目录。相反,您应该使用'NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)'或'NSFileManager.URLsForDirectory(NSDocumentDirectory,domainMask:.UserDomainMask)'在iOS 8中,Documents目录不再与应用程序目录位于同一位置。 – 2015-02-11 23:37:44

回答

2

您正在使用的“封闭”的范围的0 ... lengthOfSketchArray,其中将包括零和lengthOfSketchArray(即您将重复这个lengthOfSketchArray + 1次)。我想你打算用一个“半开”范围的0 ..< lengthOfSketchArray,这将不包括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 
    } 
} 

顺便说一句,我使用NSSearchPathForDirectoriesInDomains找到文档文件夹。显然,在保存图像时也会使用相同的技术。

此外,上面假定您已经声明并实例化此数组。例如,如果它是一个Swift数组,例如

var slideSketchArray = [UIImage]() 
+0

它看起来像我的主要问题是有错误的文件路径,所以实际上没有图像在我试图加载的地方。 – 2015-02-12 17:14:47

0

'...'在for循环中意味着您将lengthOfSketchArray作为迭代器的最后一个值。也许这就是为什么它在最后一个值时崩溃导致它超出了你的数组长度。你应该使用(lengthOfSteckArray-1)或..而不是...(我读过Swift书中的书,但我并不是100%)。无论如何,你应该验证你的可选变量是否有一个值,然后包装它才能获得价值。然后,使用NSSearchPathForDirectoriesInDomains检索路径Documents文件夹

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! 
      } 
     }