Получить значение массива в виде целого числа и показать на кнопках в реальном времени - PullRequest
1 голос
/ 23 марта 2019

Я хотел бы получить число значений в myKeyArray для печати в виде целого числа, чтобы каждый раз, когда дочерний элемент добавлялся или удалялся в firebase, он обновлялся.В настоящее время он печатает количество значений в массиве обновлений правильно, но я просто хочу, чтобы оно также было целым числом.Я попытался myKeyArray.count, но это не работает

РЕДАКТИРОВАТЬ:

я понял, что я должен печатать snapshot.children.allObjects.count, который дает мне правильное значение, но я тогдаполучить ошибку с оператором if, когда я запускаю приложение

. Основная проблема, с которой я сталкиваюсь, связана с оператором if, когда он получает число массивов из следующего узла - я хочу, чтобы он сказал, если есть3 или меньше в следующем узле - заставьте кнопки делать это или иначе, если есть 4 или больше, заставьте кнопки делать что-то еще, но это дает мне ошибку

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

        //go through array and grab 4 random names
        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 
        }

        //get the name of each user
        let numberOfKeys = randomKeyArray.count
        var names = [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
                names.append(name)
                self.currIds.append(thisUserKey)

         //show names on buttons in realtime
         if followingNum <= 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
                    //repeat for 2 more buttons

                } else if followingNum >= 4 {
                    self.currNames = names
                    self.optionA.setTitle(names[0], for: .normal)
                    self.optionB.setTitle(names[1], for: .normal) //ERROR here "Thread 1: Fatal error: Index out of range"
                   //repeat for 2 more buttons

                }
            })
        }
        }
    })
}

Я надеюсь, что это не слишком многокод, но я подумал, что это может быть полезно для фона, так как я застрял, пытаясь обновить его некоторое время

заранее спасибо:)

1 Ответ

1 голос
/ 23 марта 2019

Похоже, ваша ошибка в том, что вы положили свое утверждение if.Он находится внутри того же места, куда вы добавляете names, и это оператор for.Итак, что вы делаете, вы объявляете var names = [String](), а затем оператор if происходит на каждой итерации, когда имя еще не добавлено, если я правильно его понимаю.

//get the name of each user
    let numberOfKeys = randomKeyArray.count
    var names = [String]() //<- empty
    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
            names.append(name) //<- append
            self.currIds.append(thisUserKey)

     //show names on buttons in realtime
     if followingNum <= 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
                //repeat for 2 more buttons

            } else if followingNum >= 4 {
                self.currNames = names
                self.optionA.setTitle(names[0], for: .normal)
                self.optionB.setTitle(names[1], for: .normal) //ERROR here "Thread 1: Fatal error: Index out of range" // only names[0] exists at this point.
               //repeat for 2 more buttons

            }
        })

Таким образом, нам, вероятно, нужно сделать эту функцию, чтобы мы могли вызывать ее в нужном месте:

func showNames() {
     if followingNum <= 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
                //repeat for 2 more buttons

            } else if followingNum >= 4 {
                self.currNames = names
                self.optionA.setTitle(names[0], for: .normal)
                self.optionB.setTitle(names[1], for: .normal) //ERROR here "Thread 1: Fatal error: Index out of range"
               //repeat for 2 more buttons

            }

}

Так что это должно произойти после всех итераций для имен, так что, возможно, вызовите это здесь, только снаружии после цикла:

  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
            names.append(name)
            self.currIds.append(thisUserKey)
            }
            self.showNames()

Возможно, вам потребуется объявить followingNum вне целого:

 var followingNum = Int()

, а затем обновить его:

 self.followingNum = snapshot.children.allObjects.count

В качестве альтернативы просто убедитесь, что ваш оператор if не находится внутри цикла for.Надеюсь, что это имеет смысл, это должно решить проблему names[1].Надеюсь, что это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...