如何捕获通过SwiftUI中的函数更改的值更改?

问题描述

我的视图不检查值是否已更改。您能告诉我为什么还是可以帮助我吗?

您可以在下面看到重要代码

我的班级

import SwiftUI
import SwiftyStoreKit

class Foo: ObservableObject {
 @Published var Trigger : Bool = false
  
 func VerifyPurchase() { 
      let appleValidator = AppleReceiptValidator(service: .production,sharedSecret: "your-shared-secret")
      SwiftyStoreKit.verifyReceipt(using: appleValidator) { result in
           switch result {
                case .success(let receipt):
                     let productId = "com.musevisions.SwiftyStoreKit.Purchase1"
                     // Verify the purchase of Consumable or NonConsumable
                     let purchaseResult = SwiftyStoreKit.verifyPurchase(
                          productId: productId,inReceipt: receipt) 
                     
                     switch purchaseResult {
                          case .purchased(let receiptItem):
                               print("\(productId) is purchased: \(receiptItem)")
                               
                               self.Trigger.toggle()
                               
                          case .notPurchased:
                               print("The user has never purchased \(productId)")
                               
                               self.Trigger.toggle()
                     }
                case .error(let error):
                     print("Receipt verification Failed: \(error)")
                     
                     self.Trigger.toggle()
                     
           }
      }
 } 
} 

在SceneDelegate中,我在sceneDidbecom上的重要代码将其值触发为true,然后如果函数完成,那么我希望将其触发为false

 func scene(_ scene: UIScene,willConnectTo session: UIScenesession,options connectionoptions: UIScene.Connectionoptions) { 

      let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

      let foo = Foo()
      let contentView =  ContenView(foo: Foo).environment(\.managedobjectContext,context) 
       
      if let windowScene = scene as? UIWindowScene {
          let window = UIWindow(windowScene: windowScene)
          window.rootViewController = UIHostingController(rootView: contentView)
          self.window = window
          window.makeKeyAndVisible()
      }
 }


 func sceneDidBecomeActive(_ scene: UIScene) {
 let foo = Foo()
 foo.Trigger = true
 foo.VerifyPurchase()
 }

值更改后,我的视图不会自动更新。

struct ContentView: View {
   @Observedobject var foo: Foo
 
    var body: some View {
      Text(self.foo.Trigger ? "true" : "false")
    }
}

解决方法

SwiftyStoreKit.verifyReceipt是一个异步函数,必须在主线程上更新@Published变量。

尝试在后台更改DispatchQueue.main.async变量时添加Trigger

SwiftyStoreKit.verifyReceipt(using: appleValidator) { result in
    ...
    DispatchQueue.main.async {
        self.Trigger = false
    }
}

还请注意,Swift中的变量通常为小写-即。 trigger而不是Trigger


您还在项目中使用了两个不同 Foo实例。

我建议您从func sceneDidBecomeActive(_ scene: UIScene)中删除代码,并将其移至.onAppear中的ContentView

struct ContentView: View {
   @ObservedObject var foo: Foo
 
    var body: some View {
      Text(self.foo.Trigger ? "true" : "false")
        .onAppear {
            foo.Trigger = true
            foo.VerifyPurchase()
        }
    }
}

也代替

Text(self.foo.Trigger ? "true" : "false")

你可以做

Text(String(describing: self.foo.Trigger))