【发布时间】:2020-12-21 12:47:01
【问题描述】:
我已经为“基于文档的应用程序”制作了一个基于新的 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 进行了一些巧妙的缓存,即使我认为一切都是新创建的,也会将旧对象注入我的视图层次结构中?
【问题讨论】:
标签: ios macos swiftui swiftui-environment