2016-04-22 137 views
0

我擴展了一個簡單的導入/導出功能的應用程序,它使用plist文件來存儲導出的對象。要保存對象,我使用NSDictionarywriteToURL方法(沙盒應用程序)。如何從NSDictionary writeToURL獲取詳細的錯誤消息?

代碼的相關部分看起來是這樣的:

savePanel.beginSheetModalForWindow(self.view.window!) { (result) in 
    savePanel.orderOut(nil) 
    if result == NSFileHandlingPanelOKButton { 
     let saveURL = savePanel.URL! 
     let values = NSMutableDictionary() 
     for propertyDescription in selectedEvent.entity.properties { 
      let propertyName = propertyDescription.name 
      values[propertyName] = selectedEvent.valueForKey(propertyName) 
     } 
     if !values.writeToURL(saveURL, atomically: true) { 
      // error handling? 
     } 
    } 
} 

現在我想知道如果有一種方式來獲得詳細的錯誤信息如果保存文件失敗?

+0

'writeToFile'僅返回一個布爾https://developer.apple.com/library/watchos/documentation/Cocoa/Reference/Foundation/類/ NSDictionary_Class/index.html#// apple_ref/occ/instm/NSDictionary/writeToFile:原子地: – Moritz

+0

@EricD我完全意識到這一點。因此,我的問題:有沒有辦法如何獲得詳細的錯誤消息,如果此方法失敗? – Flovdis

+0

可以使用NSData的方法'FUNC writeToURL(網址:NSURL,選擇writeOptionsMask:NSDataWritingOptions)throws'如果你想處理錯誤 –

回答

0

我沒有意識到答案很簡單。 NSDictionary上使用的幫助器方法不是NSPropertyListSerialization,它提供了一組用於序列化反序列化plists的方法。

使用此類,將創建一個NSData對象,並將此對象寫入磁盤。編寫一個NSData對象提供了所有必需的錯誤處理。

在這裏,代碼例如由上面的新的實現:

savePanel.beginSheetModalForWindow(self.view.window!) { (result) in 
    savePanel.orderOut(nil) 
    if result == NSFileHandlingPanelOKButton { 
     let saveURL = savePanel.URL! 
     let values = NSMutableDictionary() 
     for propertyDescription in selectedEvent.entity.properties { 
      let propertyName = propertyDescription.name 
      values[propertyName] = selectedEvent.valueForKey(propertyName) 
     } 
     do { 
      let data = try NSPropertyListSerialization.dataWithPropertyList(values, format: .XMLFormat_v1_0, options: NSPropertyListWriteOptions()) 
      try data.writeToURL(saveURL, options: [.DataWritingAtomic]) 
     } catch let error as NSError { 
      dispatch_async(dispatch_get_main_queue()) { 
       self.view.window!.presentError(error) 
      } 
     } catch { 
      let unknownError = NSError(domain: kAppErrorDomain, code: 201, userInfo: [ 
       NSLocalizedDescriptionKey: "Unknown error while writing the export file." 
      ]) 
      dispatch_async(dispatch_get_main_queue()) { 
       self.view.window!.presentError(unknownError) 
      } 
     } 
    } 
} 
+0

你還應該處理pl序列化錯誤 –

+0

@LeoDabus你是對的,在我的特殊情況下,我可以保證字典總是沒有問題地串行化。不過,我會調整示例代碼。 – Flovdis