从Firestore检索时稍微延迟



当用户第一次登录到他们的配置文件时,我检索该用户名和配置文件图片。我的问题是网站加载和firebase需要大约一秒钟来加载信息。例如,那里的用户名会提示"不可用"。在显示名称之前的一小段时间

希望得到关于如何更好地改进我检索信息的过程的反馈。谢谢你!为了减少代码,我没有包括我的个人资料图片逻辑,因为我猜我的问题与我在仪表板逻辑类中首先调用Firebase的方式有关。

struct UserDashController: View {
@ObservedObject var vm = DashboardLogic()

@State private var action: Int? = 0
@State private var userSigningOut = false
@State private var showMenu = false
@State private var presentSettingsPage = false

var body: some View {
NavigationView{
VStack{
HStack{
//retrieve username
Text(vm.userModel?.name ?? "Name Unavailable" )
}
.padding()

}
.padding(.top, -5)

}
} 
<<p>仪表板逻辑/strong>
class DashboardLogic: ObservableObject {
@Published var userModel: UserModel?
@Published var privateUserModel: privateUserModel?

init(){
fetchCurrentUser()
}
private func fetchCurrentUser () {
guard let uid = FirebaseManager.shared.auth.currentUser?.uid else {
return
}
guard let email = FirebaseManager.shared.auth.currentUser?.email else {
print("could not locate email")
return
}

FirebaseManager.shared.firestore
.collection("users").document(uid)
.getDocument { snapshot, error in
if let error = error {
print ("failed to fetch user (error)")
return
}

guard let data = snapshot?.data() else {
print ("no data found for user")
return
}
self.userModel = .init(data: data)
}
//save to private database
FirebaseManager.shared.firestore
.collection("users").document(uid)
.collection("privateUserInfo")
.document("private")
.getDocument { snapshot, error in
if let error = error {
print("oh no we messed up")
return
}
//save snapshot of database from firestore
guard let userEmail = snapshot?.data() else {
print("no email found for user")
return
}

self.privateUserModel = .init(data:userEmail )
}

}
}

用户模型

struct UserModel {
var uid, name, gender, height, weight, agenda, profilePictureURL: String

init(data: [String: Any]){
self.uid = data["uid"] as? String ?? "Unavailable"
self.name = data["name"] as? String ?? "Unavailable"
self.gender = data["gender"] as? String ?? "Unavailable"
self.height = data["height"] as? String ?? "Unavailable"
self.weight = data["weight"] as? String ?? "Unavailable"
self.agenda = data["agenda"] as? String ?? "Unavailable"
self.profilePictureURL = data ["profilePicture"] as? String ?? "Unavailable"
}
}
struct privateUserModel {
var email: String

init(data: [String: Any]){
self.email = data["email"] as? String ?? "Unavailable"
}
}

我唯一要改变的是更新主队列上已发布的属性,如

DispatchQueue.main.async {
self.userModel = .init(data: data)
}
// ...
DispatchQueue.main.async {
self.privateUserModel = .init(data:userEmail )
}

我认为其他一切都只是网络延迟。

更新

无法预测延迟会持续多长时间,但是你可以在等待从Cloud Firestore获取数据的同时实现加载动画功能,而不是像这篇文章那样只有一个简单的"Unavailable"消息。

在SwiftUI视图中也有一些处理加载状态的方法,如这里所述,从自加载视图、视图模型到连接Combine发布者到视图和支持自定义加载视图。

另一方面,你可以使用活动指示器,并尝试在另一篇文章中描述的称为ProgressView的视图。

作为补充,从Cloud Firestore配置的角度来看,您可以按照最佳实践(例如选择最接近您的用户和计算资源的数据库位置)改进检索数据的过程。<<strong>深远的网络/strong>会增加查询延迟。

你也可以遵循这些关于使用异步方法的实践,这些方法可以减少你的延迟作为完成处理程序或使用async/await。

最后,考虑网络本身的外部条件可以产生延迟。

你也许会对其他相关问题感兴趣。

最新更新