我正在嘗試使用以下函式的結果:
class GetRefresh: ObservableObject {
let user = Auth.auth()
var ref = Database.database().reference()
@Published var refreshToken = ""
func getRefresh() {
ref.child("\(user.currentUser!.uid)").child("refreshUrl").getData { error, snapshot in
guard error == nil else {
print(error!.localizedDescription)
return
}
let refreshUrl = snapshot.value as? String ?? "Unknown"
let url = URL(string: refreshUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
var request = URLRequest(url: url!)
request.httpMethod = "POST"
URLSession.shared.dataTask(with:request) { (data, response, error) in
if error != nil {
print(error)
} else {
do {
let parsedData = try JSONSerialization.jsonObject(with: data!) as! [String:Any]
let token = parsedData["access_token"] as? String
self.refreshToken = token!
} catch let error as NSError {
print(error)
}
}
}.resume()
}
}
}
將作為引數傳遞給Async在我的視圖的 onAppear 中呼叫的服務:
struct DevicesTab: View {
@StateObject var callDevices = CallDevices()
@StateObject var getRfrsh = GetRefresh()
var ref: DatabaseReference!
var body: some View {
VStack(spacing: 0) {
greeting.edgesIgnoringSafeArea(.top)
messages
Spacer()
}
.onAppear {
getRfrsh.getRefresh()
callDevices.getDevices(refreshToken: getRfrsh.refreshToken) //this fails
}
}
}
正在使用該callDevices.getDevices引數作為其URLRequest.
如果我在 onAppear 中對令牌進行硬編碼,例如:
.onAppear {
getRfrsh.getRefresh()
callDevices.getDevices(refreshToken: "HardcodedToken") //this works
}
它作業正常,盡管在加載資料之前有一點延遲,但它可以作業......我確信該函式正在正確回傳,因為我能夠將它列印在GetRefresh.
uj5u.com熱心網友回復:
那么您的代碼失敗的原因是您在呼叫下一個方法之前沒有等待網路呼叫完成。
解決方案:
您可以將代碼重新撰寫為異步的。或者你可以觀察你的@Publishedvar 和 call的變化getDevices。
.onChange(of: getRfrsh.refreshToken) { newValue in
callDevices.getDevices(refreshToken: newValue)
}
.onAppear {
// to avoid repeatitive refreshing
if getRfrsh.refreshToken == ""{
getRfrsh.getRefresh()}
}
但請注意。這將getDevices在每次值更改時呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454097.html
標籤:迅速
上一篇:XCTest無法比較兩個字串
下一篇:相機視圖隱藏TabView
