更新标签,如果单身价值改变

我从Firebase获取一些用户信息并将其存储到单例中。 之后,每当价值变化,我希望标签也改变,但直到我终止的应用程序,然后再回来。

如果单身人士的价值发生变化,我应该如何更新标签?

我有选项卡的意见。 在第一个选项卡中,我分配值,并在第二个选项卡中尝试将值标记。

这是我的单身人士:

class CurrentUser: NSObject { var generalDetails: User = User()/// Consecutive declarations on a line must be separated by ';' static let sharedInstance = CurrentUser() fileprivate override init(){ super.init() } } 

而像这样,我赋值:

 self.databaseRef.child("users").child(user.uid).observeSingleEvent(of: .value) { (snapshot:FIRDataSnapshot) in guard let firebaseValue = snapshot.value as? [String:AnyObject], let userName = firebaseValue["username"] as? String, let email = firebaseValue["email"] as? String, let reputation = firebaseValue["reputation"] as? Int, let profilePicURL = firebaseValue["profileImageUrl"] as? String else { print("Error with FrB snapshot")//Here return } //Set values self.currentUser.generalDetails = User(userName: userName, email: email, reputation: reputation, profileImageURL: profilePicURL, uid: user.uid) } 

如果我想把价值放在标签上,我只需要做这件事(这个声望是唯一可以经常改变的):

 self.reputationLabel.text = String(self.currentUser.generalDetails.reputation) 

你可以做任何一个这样的:

  • 通过委托协议方法在单例和你的类之间进行通信,每当你的repo改变和更新你的标签时,就在类中激发委托方法。

  • 在您的networking链接中打开一个不同的线程在viewController本身的用户的声誉: –

     override func viewDidLoad() { super.viewDidLoad() FIRDatabase.database().reference().child("users").child(FIRAuth.auth()!.currentUser!.uid).child("reputation").observe(.childChanged, with: {(Snapshot) in print(Snapshot.value!) //Update yor label }) 

    每当声誉的价值发生变化时都会被调用。

我喜欢Dravidian的回答,我想提供一个替代品:KVO

我们使用键值观察来监控我们的应用是否与Firebase服务器断开连接。 这是概述。

我们有一个存储布尔variablesisConnected的单例,并且通过观察Firebase中的特殊节点来设置该variables

 var isConnected = rootRef.child(".info/connected") 

连接/断开连接时,isConnected var将更改状态。

我们的视图上有一个小图标,向用户显示连接状态; 当连接时它是绿色的,当断开连接时,它通过它的红线。

该图标是一个类,在每个类中,我们有代码观察isConnectedvariables; 当状态改变时,所有的图标都会自动改变。

它只需要很less的代码,可重用,干净,易于维护。

以下是Apple文档中的代码片段

 //define a class that you want to observe class MyObjectToObserve: NSObject { dynamic var myDate = NSDate() func updateDate() { myDate = NSDate() } } //Create a global context variable. private var myContext = 0 //create a class that observes the myDate var // and will be notified when that var changes class MyObserver: NSObject { var objectToObserve = MyObjectToObserve() objectToObserve.addObserver(self, forKeyPath: "myDate", options: .new, context: &myContext) 

将会有更多的东西,但这是在一个10K的水平。

苹果文档在这里

使用Swift和cocoa和Obj-c 3.01:devise模式

并向下滚动键值观测部分。 这是一个很好的阅读,非常强大。 它遵循与Firebase相同的devise模式(反之亦然) – 观察一个节点(variables)并告诉我它何时发生变化。