我正在尝试为基于UIDocument的iOS应用编写简单的快速查看预览扩展。
问题在于,在我preparePreviewOfFile(at:completionHandler:)
的实现中,我尝试打开基于URL的UIDocument正在失败。我使用文件URL实例化我的文档并调用open(completionHandler:)
,但我没有收到任何数据,而且我看到文件协调器崩溃的控制台消息。
所有这些在我的实际应用中运行良好;它只是快速查看预览扩展实施,遇到了麻烦。从Quick Look Preview Extension中打开UIDocument有什么特别之处吗? Apple没有提供任何示例代码;在WWDC 2017视频229中,他们只是掩盖了整个事情。
编辑: Curiouser和curiouser。我创建了一个简化的测试平台应用程序,它使用UIDocumentInteractionController显示快速查看预览,以及我的自定义快速查看预览扩展。在模拟器上,预览有效!在设备上,它没有。看起来,当我告诉我的文档打开时,它的load(fromContents:ofType)
从未被调用过;相反,我们收到一对错误消息:
与名为com.apple.FileCoordination的服务的连接无效。
一个进程调用了
-[NSFileCoordinator coordinate...]
个方法之一,但是文件协调崩溃了。返回错误。
答案 0 :(得分:0)
我能够通过而不是在我的UIDocument上调用open
来解决这个问题。相反,我直接在后台线程上调用read
,如下所示:
func preparePreviewOfFile(at url: URL, completionHandler handler: @escaping (Error?) -> Void) {
DispatchQueue.global(qos: .background).async {
let doc = MyDocument(fileURL: url)
do {
try doc.read(from: url)
DispatchQueue.main.async {
// update interface here!
}
handler(nil)
} catch {
handler(error)
}
}
}
我不知道这是否合法。你认为只是在不使用文件协调器的情况下直接读取文档就不好了。但它似乎确实有效!
我找到了另一种解决方法,使用NSFileCoordinator并手动调用load
来获取UIDocument来处理数据:
let fc = NSFileCoordinator()
let intent = NSFileAccessIntent.readingIntent(with: url)
fc.coordinate(with: [intent], queue: .main) { err in
do {
let data = try Data(contentsOf: intent.url)
let doc = MyDocument(fileURL: url)
try doc.load(fromContents: data, ofType: nil)
self.lab.text = doc.string
handler(nil)
} catch {
handler(error)
}
}
再次,这是否合法,我不知道,但我比直接调用read
感觉更好,因为至少我正在通过文件协调员。