swiftui 异步初始化
Posted
技术标签:
【中文标题】swiftui 异步初始化【英文标题】:asynchronous initialisation with swiftui 【发布时间】:2020-08-13 00:40:46 【问题描述】:基本上-我经常遇到这种情况-我不明白您如何正确地使用回调快速进行异步初始化。 (用结合 - 我可以做到)。特别是 - 我有这个代码:
struct MyView : View
@State var initialised : Bool = false
init()
var initialisedBinding = $initialised
Photos.phphotoLibrary.RequestAuthorization
status in
if (status == Photos.PHAuthorizationStatus.authorized)
print("here I am")
initialisedBinding.wrappedValue = true
initialisedBinding.update()
var body : some View
VStack
if (initialised)
Text("yep")
else
Text("nope")
当我运行它时 - 我打印出来了 - 但文本永远不会改变 - 它总是保持“不”。我做错了什么,我该如何做对? (不使用 combine - 我可以使用 currentValueSubject 和 .onreceive 之类的方法 - 但这是额外的开销,我真的很想知道为什么上面的代码不起作用 - 显然我理解的不好)
【问题讨论】:
在 SwiftUI 中,视图不应该是长期存在的并且有生命周期——它们只是描述视图的结构。每当发生变化时,它们会根据需要由 SwiftUI 初始化和销毁。任何异步都应该存在于视图“观察”并做出反应的视图模型中 【参考方案1】:init
中的状态还没有准备好,所以你无处可去。此外,init
中的此类活动并不好,因为在渲染期间可以多次创建视图。比较合适的地方是.onAppear
struct MyView : View
@State var initialised : Bool = false
var body : some View
VStack
if (initialised)
Text("yep")
else
Text("nope")
.onAppear
Photos.PHPhotoLibrary.RequestAuthorization
status in
if (status == Photos.PHAuthorizationStatus.authorized)
print("here I am")
self.initialised = true
【讨论】:
太棒了——这就是我一直在寻找的(但从未听说过)——谢谢!以上是关于swiftui 异步初始化的主要内容,如果未能解决你的问题,请参考以下文章
在 SwiftUI 视图中结合 onChange 和 onAppear 事件?