我的一个视图中有一段非常基本的代码:
.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
}
}
视图是否相应地更新(活动加载器(?