Возможность одновременного добавления нескольких значений операций чтения к массиву - Swift & Firebase - PullRequest
0 голосов
/ 01 декабря 2018

в VC поиска моего приложения, каждая ячейка табличного представления имеет изображение профиля, имя и соответствующую запись.У меня есть три отдельные операции чтения, чтобы получить каждый кусок.Проблема в том, что я не могу получить переменную из каждой операции чтения для добавления в массив - даже если она определена глобально.Чтобы исправить это, я добавил три отдельные функции, которые вызываются в каждой операции чтения, а затем вызываются для добавления значения в массив.У каждого поста есть ключ, который является идентификатором.Как вы уже догадались, я не могу получить значения из каждой операции чтения, чтобы все сразу добавлялись в массив - что объясняет, почему некоторые <null>.Вот мой код:

func a(message:String) -> String{
        print(message)
        let mess = message

        return mess
    }
    func b(url: String) -> String{
        print(url)
        return url
    }
    func c(name:String) -> String {
        print(name)
        let name = name
        return name
    }

    func searchNames(id: String){
        var name = String()
        var message = String()
        var profURL = String()
        Database.database().reference().child("\(UserData().mySchool!)/posts/\(id)/message").observeSingleEvent(of: .value, with: { (snapshot) in
            message = "\(snapshot.value!)"
            self.a(message: message)

//            print("Message:",message)
        })
        Database.database().reference().child("\(UserData().mySchool!)/posts").child("\(id)/username").observe(.value, with: { (username) in
            name = "\(username.value!)"
//            print("user:",name)
            self.c(name: name)
        })

        Database.database().reference().child("\(UserData().mySchool!)/posts/\(id)/profileURL").observe(.value, with: { (url) in
            profURL = "\(url.value!)"
            self.b(url: profURL)
        })

        let x = a
        let y = b
        let z = c
        print("x",x,"y",y,"z",z)
        let user = Person(category: x, name: z, id: id, url: y)
        self.candies.append(user)
        print(message, name,id, profURL)
        self.tableView.reloadData()

Идея с функциями (a, b, c) состоит в том, что они будут возвращать значение вне операции чтения и могут использоваться для добавления массива.Строка print("x",x,"y",y,"z",z) печатает

x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)
x (Function) y (Function) z (Function)

Это структура, из которой я читаю: enter image description here Любые идеи о том, как извлечь каждое отдельное значение из операции чтения ион будет добавлен в массив Person?

1 Ответ

0 голосов
/ 01 декабря 2018

Сосредоточьтесь на том, чтобы сделать вашу структуру базы данных более эффективной, а не на том, чтобы исправить эту неэффективность.Необходимость сделать 3 звонка, чтобы получить необходимые данные, является чрезмерной и рискованной, что произойдет, если один или два из этих звонков потерпят неудачу?

У вас есть узел для поиска, где вы можете получить изображение профиля, имя и сообщениев одном вызове.

Теперь, если вы настроены на реализацию своей реализации, вы могли бы иметь обработчик завершения для каждого вызова и вкладывать ваши вызовы;как только один завершен, вызовите следующий, в конце последнего добавьте все в ваш массив.Но опять же, я настоятельно советую против этого!

РЕДАКТИРОВАТЬ: Если у вас есть другой vc, где загрузка комментариев рассматривает создание отдельного узла для комментариев (-comments --postIdTheCommentBelongsTo --- commentId).Или объедините вашу реализацию с моим предложением: оставьте один или два комментария в своем, а остальные сохраните их, как я предложил;когда пользователь нажимает «просмотреть больше», сделайте второй звонок, чтобы загрузить дополнительные комментарии.

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