如果单例中的值更改,则更新标签

时间:2016-11-26 10:02:55

标签: ios swift firebase firebase-realtime-database

我从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)

2 个答案:

答案 0 :(得分:1)

您可以执行以下任一操作: -

  • 使用delegate-protocol方法在单例和您的类之间进行通信,只要您的repo更改并更新标签,就会在类中触发委托方法。

  • 在您的网络链接中打开一个不同的主题,以获取用户在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
    })
    

    每次声誉值发生变化时都会调用。

答案 1 :(得分:0)

我喜欢Dravidian的答案,我想提供另一种选择:KVO

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

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

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

连接/断开连接时,isConnected var会改变状态。

我们的视图上有一个小图标,表示用户已连接状态;连接时它是绿色的,当它断开连接时它是红色的,并且有一条线穿过它。

该图标是一个类,在每个类中我们都有代码来观察isConnected变量;当状态发生变化时,所有图标都会自动更改。

只需很少的代码,可重复使用,干净且易于维护。

这是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英尺。

Apple文档在这里

Using Swift with Cocoa and Obj-c 3.01: Design Patterns

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