Я получаю некоторую информацию о пользователе из 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)
0
Tarvo Mäesepp 26 Ноя 2016 в 13:02

2 ответа

Лучший ответ

Вы можете сделать одно из следующих действий: -

  • Общайтесь между синглтоном и вашим классом с помощью метода протокола делегата, запускайте метод делегата в классе всякий раз, когда ваше репо изменяется, и обновляйте свою метку.

  • Откройте другой поток в вашей сетевой ссылке для репутации пользователя в самом 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
Tarvo Mäesepp 26 Ноя 2016 в 14:41

Мне нравится ответ Дравидиана, и я хотел бы предложить альтернативу: KVO

Мы используем Key-Value Observing, чтобы отслеживать, отключено ли наше приложение от сервера 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)

Будет еще кое-что, но это все на уровне 10 км.

Документация Apple находится здесь

Использование Swift с Cocoa и Obj-c 3.01: шаблоны проектирования

И прокрутите вниз раздел наблюдения за ключевыми значениями. Это хорошее чтение и очень мощный. Он следует тому же шаблону проектирования, что и Firebase (или наоборот) - наблюдайте за узлом (переменной) и сообщайте мне, когда он изменяется.

0
Jay 26 Ноя 2016 в 13:53