我已经为“基于文档的应用程序”制作了一个基于新的 SwiftUI 多平台目标的应用程序。但是,我面临着奇怪的问题。只要应用程序在前台,它就可以正常工作。如果通过任务切换将其移至后台,然后再次移至前台,则会将突变保存到文档中,但 SwiftUI 视图不会接收突变。因此,每当您在 UI 中按下一个更改文档的按钮时,当您从磁盘重新加载文档时,您会看到没有发生任何变化。
所以我在想,我使用 ObservedObjects,一旦我移动到后台,它们可能会被踢出内存。这可能是我的错误的原因吗?
但后来我在 App 结构中添加了一个打印行。
import SwiftUI
@main
struct MyApp: App {
fileprivate func myLogging(_ file: FileDocumentConfiguration<MyDocument>) -> some View {
print("""
IT IS CALLED
""")
return MainView().environmentObject(BindingWrapper(file.$document))
}
var body: some Scene {
DocumentGroup(newDocument: MyDocument()) { (file) in
return myLogging(file)
}.commands { AppCommands() }
}
}
猜猜看……这个打印总是在渲染突变之前执行。这是有道理的。因为file.$document
是一个绑定,如果你做了一个变异操作,绑定会警告苹果文件是脏的,但它也会使整个层次结构失效。一旦发生错误,此日志记录仍将打印!
因此, MainView().environmentObject(BindingWrapper(file.$document))
我假设一切都是从头开始创建的。BindingWrapper 是一个自定义类,用于转换可观察对象中的绑定。这是我担心的对象之一,他们可能会被释放。但如果它们是新创建的……它们应该一直在那里,对吧?顺便说一句,这个对象归环境所有。所以它不应该被释放。
所以,现在我被困住了。Apple 是否在绑定 / ObservedObjects 上做了一些巧妙的缓存,即使我认为一切都是新创建的,也会将旧对象注入我的视图层次结构中?