问题描述
我的视图不检查值是否已更改。您能告诉我为什么还是可以帮助我吗?
您可以在下面看到重要代码。
我的班级
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))