等待firebase加载,直到显示View



我目前正在构建一个应用程序,我面临一些问题。我使用重火力点存储用户数据,然后显示在的一些观点,我设法创建一个函数来检索数据完成,所以异步的问题是解决了,但是现在当我需要显示的数据显示为零,因为比重火力点加载更快的加载视图。

从firebase加载数据的函数:

func getUserFromUID(completion: @escaping (UserData)->()){


ref.child("users").child(uid).observe(.value) { (snapshot) in
DispatchQueue.main.async {
guard let dictionary = snapshot.value as? [String:AnyObject]  else { return}

var user = UserData()

if let email = dictionary["email"]{ user.email = email  as? String }
if let name = dictionary["name"]{ user.name = name  as? String }
user.firstname = (dictionary["firstname"] as! String)
user.lastname = (dictionary["lastname"] as! String)
user.type = (dictionary["type"] as! String)
user.uid = (dictionary["uid"] as! String)
user.profileImageUrl = (dictionary["profileImageUrl"] as! String)
user.id = snapshot.key
user.fcmToken2 = (dictionary["fcmToken"] as! String)


completion(user)
}
}

}

ChatsHomeView:

struct ChatsHomeView: View {

@ObservedObject var session : SessionStore
@State var user = UserData()

func getUserInfo(){
session.getUserFromUID { (fetcheduser) in
self.user = fetcheduser
print("THE USER:(user)")
}
}

var body: some View {

VStack{

Text(user.name ?? "nil")
Button(action: {
session.signOut()
}){ Text("Logout").padding() }
}.onAppear{
getUserInfo()
}
}
}

问题是,一旦用户登录,它显示nil在ChatsHomeView文本(user.name ?? ?)"nil")字段为。我需要重新启动应用程序的字段更新和显示的名称。是否有办法显示应用程序启动屏幕,直到firebase完全加载,或者可能有任何其他方式?

iOS应用程序肯定会在任何网络操作完成之前准备好显示视图。

保持启动屏幕可见的要求可以通过让第一个VC的UI匹配启动视图来满足。我已经在一个Objective-C应用程序中这样做了。在它中,第一个VC在viewDidLoad中加载启动视图的nib并将其设置为视图。

用户快照的完成代码应该检查启动UI是否仍然可见。如果是,它可以将UI更改为期望用户数据的UI。

编辑来自Objective-C项目的说明:

在主故事板中指定的第一个VC中,从应用程序的启动故事板中抓取UI,并暂时用它覆盖视图。用户的感觉是,发布仍在进行中。启动异步工作。当它完成后,更改UI回来…

- (void)viewDidLoad {
[super viewDidLoad];

NSString *storyboardName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UILaunchStoryboardName"];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
UINavigationController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LaunchVC"];
UIView *launchView = vc.view;

[self.view addSubview:launchView];
[self startObserving:^(FIRDocumentSnapshot *snapshot, NSError *error) {
if (!error) {
// the async work has completed
// setup this VC's underlying view with data from the snapshot, then uncover it
[launchView removeFromSuperview]; 
}
}];
}

为什么不启用firebase离线功能呢?它可以帮助你自动同步当前数据,而且它不会一次又一次地加载所有数据

您需要为您的firebase数据库启用isPersistenceEnabled属性

Database.database().isPersistenceEnabled = true

那么你需要使用keepSynced(true),这样数据将保持同步。

持久性行为:

通过启用持久性,Firebase实时数据库客户端在在线时同步的任何数据都会持续到磁盘,并且在离线时可用,即使用户或操作系统重新启动应用程序。这意味着您的应用程序通过使用存储在缓存中的本地数据像在线一样工作。侦听器回调将继续触发本地更新。

keepSynced(真正的):

Firebase Realtime Database为活动监听器同步并存储数据的本地副本。此外,您还可以保持特定位置同步。

更多信息请查看此文档

最新更新