Firebase & Swift: обновление пользовательской информации в реальном времени в приложении после его обновления в Firebase - PullRequest
0 голосов
/ 05 марта 2019

Мое приложение требует, чтобы вы следили как минимум за четырьмя людьми (или кнопки «По крайней мере за 4 друзьями»), чтобы начать отвечать на вопросы с несколькими вариантами ответов о людях, за которыми вы следуете.Прямо сейчас, когда пользователь следует за кем-то, он обновляется на базе Firebase, но тот, за кем он следует, не отображается в реальном времени на странице MCQ / Q & A, если я не запускаю приложение с самого начала.

Как я могу получитьобновить его в реальном времени вместо того, чтобы заново запускать его с начала?

ОБНОВЛЕНИЕ:

Я изменил свою предыдущую функцию наблюдаем единого события на функцию наблюдения с DataEventType.value, и это лучше, чемраньше, так как он обновляется, когда я подписываюсь и отписываюсь от людей, но ТОЛЬКО если у пользователя более 4 подписчиков.

Прямо сейчас, если я отписываюсь ниже 4 человек, отображается сообщение «следуй по крайней мере за 4 друзьями правильно», но как толькоЯ повторяю до 4 или более кнопок, которые вызывают 4 случайных пользователя, но останавливаются и не могут быть нажаты.

Кроме того, когда я пытаюсь добавить функцию dismiss в нижней части для обеих функций наблюдения - она ​​выходит из строя и выигрываетне позволяйте мне перейти на страницу

Вот обновленный код (надеюсь, я объяснил это правильно и извините, если он увидитмс, как глупый вопрос, я ценю любую помощь / объяснение) - заранее спасибо:)

Функция, которая вызывается в viewDidLoad:

var ref: DatabaseReference = Database.database().reference()
var currNames: [String] = []
var currIds: [String] = []
let imageViewA = UIImageView()
let imageViewB = UIImageView()
let imageViewC = UIImageView()
let imageViewD = UIImageView()

func getFourRandomNodesAndPrintUserName() {
    self.currNames = []
    self.currIds = []

    var myKeyArray = [String]()
    guard let uid = Auth.auth().currentUser?.uid else {
        return
    }

    let ref = self.ref.child("following").child(uid) //retreives all nodes in the following node
    ref.observe(DataEventType.value, with: { (snapshot) in
        print(snapshot.children.allObjects)
        for child in snapshot.children { //build the array of keys
            let snap = child as! DataSnapshot
            let key = snap.key
            myKeyArray.append(key)
    }

        var randomKeyArray = [String]()
        let numFollowers = min(4, myKeyArray.count)
        for _ in 0..<numFollowers { //will iterate four times
            let count = myKeyArray.count //get the number of elements
            let randomInt = Int.random(in: 0..<count) //get a random index for the array
            let randomUserKey = myKeyArray[randomInt]
            randomKeyArray.append(randomUserKey)
            myKeyArray.remove(at: randomInt) //remove that object so it's not selected again
        }

        let numberOfKeys = randomKeyArray.count
        var namesRemaining = numberOfKeys
        var names = [String]()
        var namesWithUrl = [String : String]()
        var profileImages = [String]()

        for i in 0..<numberOfKeys {
            let thisUserKey = randomKeyArray[i]
            let userRef = self.ref.child("users").child(thisUserKey)
            userRef.observeSingleEvent(of: .value, with: { snapshot in
                let name = snapshot.childSnapshot(forPath: "fullname").value as! String
                let profileImageUrl = snapshot.childSnapshot(forPath: "profileImageUrl").value as! String
                print(name)
                print(profileImageUrl)
                namesRemaining -= 1
                names.append(name)
                profileImages.append(profileImageUrl)
                namesWithUrl[name] = profileImageUrl

                self.currIds.append(thisUserKey)

                if numFollowers <= 3 {
                    self.optionA.setTitle("Follow\nat least\n4 friends!", for: .normal)
                    self.optionA.isEnabled = false

                    self.optionB.setTitle("Follow\nat least\n4 friends!", for: .normal)
                    self.optionB.isEnabled = false

                    self.optionC.setTitle("Follow\nat least\n4 friends!", for: .normal)
                    self.optionC.isEnabled = false

                    self.optionD.setTitle("Follow\nat least\n4 friends!", for: .normal)
                    self.optionD.isEnabled = false
                }
                else if namesRemaining == 0 {
                    self.currNames = names
                    self.optionA.setTitle(names[0], for: .normal)
                    let optionAUrl = URL.init(string: namesWithUrl[names[0]]!)
                    self.imageViewA.sd_setImage(with: optionAUrl)

                    self.optionB.setTitle(names[1], for: .normal)
                    let optionBUrl = URL.init(string: namesWithUrl[names[1]]!)
                    self.imageViewB.sd_setImage(with: optionBUrl)

                    self.optionC.setTitle(names[2], for: .normal)
                    let optionCUrl = URL.init(string: namesWithUrl[names[2]]!)
                    self.imageViewC.sd_setImage(with: optionCUrl)

                    self.optionD.setTitle(names[3], for: .normal)
                    let optionDUrl = URL.init(string: namesWithUrl[names[3]]!)
                    self.imageViewD.sd_setImage(with: optionDUrl)
                }
                //self.dismiss(animated: true, completion: nil) //it works when i don't include this otherwise there is a bug

            })
        }
        //self.dismiss(animated: true, completion: nil) //it works when i don't include this otherwise there is a bug out
    })
}

ОБНОВЛЕНИЕ:

Я скопировал фрагмент моей структуры JSON в реальном времени из базы данных Firebase:

"following" : {
      "MJxCFUX0jpXJD1a2u0iqt6xSAdB3" : {
      "5W6Qf4cJKQb5nY1PthMUelHLShy2" : true,
      "GU03rUQPrIX4zleX1S8L8anSWmn2" : true,
      "MfeIehKJKzS2Cf0kA0JTmHZGWSu1" : true
    },
      "MfeIehKJKzS2Cf0kA0JTmHZGWSu1" : {
      "5W6Qf4cJKQb5nY1PthMUelHLShy2" : true,
      "GU03rUQPrIX4zleX1S8L8anSWmn2" : true,
      "MJxCFUX0jpXJD1a2u0iqt6xSAdB3" : true,
      "nZLf70wvZUYqrAExXmnSX9G7Rar2" : true
    },
      "nZLf70wvZUYqrAExXmnSX9G7Rar2" : {
      "5W6Qf4cJKQb5nY1PthMUelHLShy2" : true,
      "FwUzqbn49FP5jS5mIuaAEnrxvpj2" : true,
      "GU03rUQPrIX4zleX1S8L8anSWmn2" : true,
      "MJxCFUX0jpXJD1a2u0iqt6xSAdB3" : true,
      "MfeIehKJKzS2Cf0kA0JTmHZGWSu1" : true
    }


"users" : {
     "5W6Qf4cJKQb5nY1PthMUelHLShy2" : {
      "email" : "aaaa@gmail.com",
      "fullname" : "Aaaa",
      "fullname_lowercase" : "aaaa",
      "profileImageUrl" : "https://firebasestorage.googleapis.com/v0/b/pinion-4896b.appspot.com/o/profile_image%2F5W6Qf4cJKQb5nY1PthMUelHLShy2?alt=media&token=eba41189-98dc-45d0-bccc-769cc8fa872f"
    },
     "FwUzqbn49FP5jS5mIuaAEnrxvpj2" : {
      "email" : "ffff@gmail.com",
      "fullname" : "Ffff",
      "fullname_lowercase" : "ffff",
      "profileImageUrl" : "https://firebasestorage.googleapis.com/v0/b/pinion-4896b.appspot.com/o/profile_image%2FFwUzqbn49FP5jS5mIuaAEnrxvpj2?alt=media&token=55649e15-4e6c-4b44-b804-1b4a9e8e4272"
    },
}

1 Ответ

0 голосов
/ 05 марта 2019

Таким образом, вы можете использовать функцию observ вместо observeSingleEvent. Пример из Google Doc: postRef.observe(DataEventType.value, with: { (snapshot) in let postDict = snapshot.value as? [String : AnyObject] ?? [:] // ... })

DataEventType (это enum) имеют следующие значения: /// A new child node is added to a location. FIRDataEventTypeChildAdded, /// A child node is removed from a location. FIRDataEventTypeChildRemoved, /// A child node at a location changes. FIRDataEventTypeChildChanged, /// A child node moves relative to the other child nodes at a location. FIRDataEventTypeChildMoved, /// Any data changes at a location or, recursively, at any child node. FIRDataEventTypeValue

Observ функция работает как шаблон слушателя-наблюдателя, поэтому не забудьте отменить подписку на событие наблюдения.

...