我有一个UIDocument
的自定义子类,用于存储用户的应用内容。我直接致电-[UIDocument updateChangeCount:UIDocumentChangeDone]
来跟踪对文档的更改。保存和加载工作正常,但文档永远不会自动保存。为什么会发生这种情况?
答案 0 :(得分:5)
事实证明问题是我没有从主线程调用-[UIDocument updateChangeCount:]
。尽管UIDocument不是UI元素,但它仍然是UIKit
的一部分,所以关于始终与主线程中的UIKit
类交互的常见警告仍然适用。
将代码包装到主队列中解决了问题:
dispatch_async(dispatch_get_main_queue(), ^{
[doc updateChangeCount:UIDocumentChangeDone];
});
答案 1 :(得分:1)
首先,更新Jayson对Swift的回答:
DispatchQueue.main.async {
doc.updateChangeCount(.done)
}
如果仅在一个或两个位置调用它,此方法就很好。但是,如果您有多个调用,并且有可能在后台线程上进行调用,则最好子类UIDocument
并重写updateChangeCount(:)
函数,以便强制执行主调用。否则,您将有责任每次都进行主呼叫,这使您有可能错过,导致文档进入saveError
状态。
然后,您的子类中将具有这样的覆盖:
override func updateChangeCount(_ change: UIDocumentChangeKind) {
DispatchQueue.main.async {
super.updateChangeCount(change)
}
}