【问题标题】:How can I get a detailed error message from NSDictionary writeToURL?如何从 NSDictionary writeToURL 获得详细的错误消息?
【发布时间】:2016-08-15 21:08:20
【问题描述】:

我用简单的导入/导出功能扩展了一个应用程序,它使用 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?
        }
    }
}

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

【问题讨论】:

  • writeToFile 只返回一个布尔值developer.apple.com/library/watchos/documentation/Cocoa/…
  • @EricD 我完全清楚这一点。因此我的问题是:如果此方法失败,有没有办法获得详细的错误消息?
  • 如果您想处理错误,可以使用 NSData 方法func writeToURL(url: NSURL, options writeOptionsMask: NSDataWritingOptions) throws
  • @LeoDabus 我找不到从NSDictionary 获取带有plist 的NSData 对象的方法。我该如何进行这种转换?

标签: swift cocoa error-handling nsdictionary


【解决方案1】:

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

使用这个类,一个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)
            }
        }
    }
}

【讨论】:

  • @LeoDabus 你是对的,在我的特殊情况下,我可以保证字典总是会毫无问题地序列化。不过我会调整示例代码。
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
相关资源
最近更新 更多