Updating label if value in singleton changes

爱⌒轻易说出口 提交于 2020-01-17 03:16:08

问题


I am getting some user information from Firebase and storing it into singleton. After that every time the value changes I want that the label changes also but it doesn't until I terminate the app and come back in.

How should I update label if value changes in singleton?

I have tab views. In first tab I assign values and in second tab I try to put the values to label.

This is my singleton:

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()
    }

}

And like this I assign values:

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)
        }

And if I want to put the value to the label I simply do this(This reputation is the only thing that can change often):

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

回答1:


You can do either of these:-

  • Communicate between the singleton and your class with delegate-protocol method , fire the delegate method in the class whenever your repo changes and update your label.

  • Open a different thread in your network link for the user's reputation in the viewController itself:-

    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
    })
    

    which will get called every time the value of reputation changes.




回答2:


I like Dravidian's answer and I would like to offer an alternative: KVO

We use Key-Value Observing to monitor if our app is disconnected from the Firebase server. Here's the overview.

We have a singleton which stores a boolean variable isConnected, and that variable is set by observing a special node in Firebase

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

When connected/disconnected, the isConnected var changes state.

We have a little icon on our views that indicates to the user the connected state; when connected it's green, when disconnected it's red with a line through it.

That icon is a class and within each class we have code that observes the isConnected variable; when it's state changes all of the icons change automatically.

It takes very little code, is reusable, is clean and easily maintained.

Here's a code snippet from the Apple documentation

//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)

There will be more to it but that's it at a 10k foot level.

The Apple documentation is here

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

and scroll down the the Key-Value Observing Section. It's a good read and very powerful. It follows the same design pattern as Firebase (or vice-versa) - observe a node (variable) and tell me when it changes.



来源:https://stackoverflow.com/questions/40817118/updating-label-if-value-in-singleton-changes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!