如何从NSDictionary writeToURL获取详细的错误消息?

时间:2016-04-22 09:45:19

标签: swift cocoa error-handling nsdictionary

我使用简单的导入/导出功能扩展了一个应用程序,该功能使用plist文件来存储导出的对象。要保存对象,我使用NSDictionarywriteToURL方法(沙盒应用)。

代码的相关部分如下所示:

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

现在我想知道是否有办法获取详细的错误消息如果保存文件失败了?

1 个答案:

答案 0 :(得分:0)

我没有意识到答案很简单。 NSDictionary不是使用NSPropertyListSerialization上的辅助方法,而是NSData提供了序列化反序列化plist的完整方法集。

使用此类,将创建一个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) } } } } 对象可提供所有必需的错误处理。

这里是上面的代码示例,其中包含新的实现:

    <Button>
        <Button.Template>
            <ControlTemplate TargetType="Button">
                <ContentPresenter />
            </ControlTemplate>
        </Button.Template>
        <Rectangle Width="100"
                   Height="100"
                   Fill="Red" />
    </Button>