在OnOpenUrl视图修饰符中的api调用后刷新视图



我的一个视图中有一段非常基本的代码:

.onOpenURL(perform: { url in
avm.handleRedirect(viewContext,url: url)        })

其中avm被定义为

@ObservedObject var avm = AccountsViewModel.makeAccountsViewModel()

avm具有以下基本性质:

@Published var isLoading = true

设置后,我的视图将侦听并显示一个加载微调器。这适用于除以下情况外的所有其他情况。

handleRedirect函数如下所示:

func handleRedirect(_ context: NSManagedObjectContext, url: URL) {

debugPrint("Handling redirect")
let url = URLComponents(string: url.absoluteString)!

let code = url.queryItems?.first(where: { $0.name == "code" })?.value
trueLayerClient.getAccessToken(code: code!) { res in

if res == nil {
debugPrint("accessTokenResponse was nil")
}

self.api.storeTokens(
str: API.StoreTokensRequest(
userID: "***",
authToken: res!.accessToken,
refreshToken: res!.refreshToken,
apiKey: "***"
), finished: { success in
if success{
debugPrint("was successful")
DispatchQueue.main.async{
self.isLoading = false
}
} else {
debugPrint("store token failed")
}
})
}
}

我正在使用我安装的通用链接触发此onOpenUrl。

当我点击链接时,我的应用程序从后台打开,我看到以下日志:

Handling Redirect
Was successful

然而,该应用程序从未进入加载状态。此外,UI变成";"阻塞";我必须硬杀这个应用程序才能按下任何键。

一旦我重新打开应用程序,新状态(我通过api获取并存储在CoreData中(就会反映在视图中。

一开始我觉得我的API响应太快了,但我睡了5秒,我仍然看到UI被阻止,但日志相同(只是相距更远(。

如果能在这方面提供任何帮助,我将不胜感激。

如果有帮助的话,我的storeTokens API调用如下:

func storeTokens(str: StoreTokensRequest , finished: @escaping (Bool)->Void) {
let u = URL(string:"(self.baseURL)/(storeTokenPath)")!

var req = URLRequest(url: u)
req.addValue("application/json", forHTTPHeaderField: "Content-Type")
req.httpMethod = "POST"

let reqBody = str

debugPrint("req bodyed")

guard let encoded =  try? JSONEncoder().encode(reqBody) else {
debugPrint("failed to encode req")
finished(false)
return
}
req.httpBody = encoded

debugPrint("encoded")


let task =  URLSession.shared.dataTask(with: req) { data, response, error in

guard let httpResponse = response as? HTTPURLResponse else {
debugPrint("wasnt http rep")

finished(false)
return
}

debugPrint("status code is: (httpResponse.statusCode)")

if httpResponse.statusCode < 299 {
debugPrint("About to call true")
finished(true)
return
}
}

task.resume()
}
}

我在输出中也看到了这个函数中的所有日志,为了简洁起见,我只是省略了它们。

我尝试过类似于您的实现。我的"onOpenUrl(("方法是在必要时唤醒我的应用程序,并将url传递给我的应用,应用程序正在正确更新其状态。

基本检查。

暂时忘记"onOpenUrl";。在您的视图中实现此方法:

.onAppear {
viewModel.onAppear()
}

在您的视图模型中;isLoading;所有物例如,

func onAppear(){
self.isLoading = true
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
print("- loading complete")
self.isLoading = false
}
}

视图是否相应地更新(活动加载器(?

最新更新