Как создать для l oop итерации до значения переменной - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь создать для l oop итерацию от 1 до количества раз, которое переменная возвращает из firebase.

В моей базе данных есть структура:

project-id
    featured
        amount: 2
        post1
            postID: postID
            userOfPost: userID
        post2
            postID: postID
            userOfPost: userID

Переменная «количество» будет динамически изменяться при добавлении сообщения в узел «Избранные». Я использую эти данные «количества», чтобы узнать, сколько раз мне нужно выполнить итерацию для l oop, чтобы добавить данные каждой записи в свой собственный массив, например:

post1 = ["postID", "userID"]
post2 = ["postID", "userID"]

Код I пока что есть:

    func getFeaturedPost(){
    var number = 0
    ref.child("featured").child("amount").observeSingleEvent(of: .value, with: { (snapshot) in

        number = snapshot.value as! Int
        print(number)
    })

    for pos in 1...number+1{ 
        ref.child("featured").child("post\(pos)").observeSingleEvent(of: .value, with: { (snapshot) in
        let postID = (snapshot.value as? NSDictionary)?["postID"] as? String ?? ""
        let userOfPost = (snapshot.value as? NSDictionary)?["userOfPost"] as? String ?? ""
        print("postID: \(postID)")
        print("userOfPost: \(userOfPost)")
        })
    }
}

В данный момент я получаю только первый узел назад (post1). Правильно ли я сделал для l oop или есть лучший способ получить данные более чем одного ребенка в Firebase?

1 Ответ

3 голосов
/ 17 января 2020

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

Помните, что получение данных из Inte rnet требует времени, поэтому методы, которые получают данные из Inte rnet, обычно имеют обработчик завершения, который будет вызван, когда он сделает свою работу в фоновом режиме. Вы должны поместить for l oop в обработчик завершения перед ним. Кроме того, l oop должно быть 0..<number, потому что 1...number+1 будет l oop на один раз больше, чем необходимо, и 1...number увеличит sh, если number равно 0.

ref.child("featured").child("amount").observeSingleEvent(of: .value, with: { (snapshot) in

    number = snapshot.value as! Int
    print(number)


    for pos in 0..<number { 
        ref.child("featured").child("post\(pos + 1)").observeSingleEvent(of: .value, with: { (snapshot) in
        let postID = (snapshot.value as? NSDictionary)?["postID"] as? String ?? ""
        let userOfPost = (snapshot.value as? NSDictionary)?["userOfPost"] as? String ?? ""
        print("postID: \(postID)")
        print("userOfPost: \(userOfPost)")
        })
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...