2015-02-11 88 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! 
      } 
     }