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 事件?

SwiftUI @State var 初始化问题

SwiftUI:NavigationButton 初始化程序给出错误

SwiftUI @State 变量没有被取消初始化

为啥这个 SwiftUI 视图会初始化两次?

SwiftUI:popover.show 后重新初始化