извлечение данных из базы данных и сохранение информации в виде таблицы - PullRequest
0 голосов
/ 27 сентября 2019

Добрый вечер, я пытался получить информацию о пользователях из firebase для публикации на tableViewController, очень похожем на ленту уведомлений Instagram.Я застрял в этом вопросе в течение некоторого времени, и мне действительно трудно понять его.Я задавал этот вопрос здесь ранее, но я до сих пор не нашел решения.

Я постараюсь объяснить свой код как можно больше в надежде найти решение.

Ниже показано, как я сохраняю данные в firebase.

Here is how my data is saved in firebase.

вот расширение моей базы данных

extension Database {

static func fetchPoster(with uid: String, completion: @escaping(Poster) -> ()) {

    USER_REF.child(uid).observeSingleEvent(of: .value) { (snapshot) in
        guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return }
        let poster = Poster(dictionary: dictionary)
        completion(poster)
    }
}

static func fetchUser(with postId: String, completion: @escaping(User) -> ()) {

    USER_REF.child(postId).observeSingleEvent(of: .value) { (snapshot) in
        guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return }
        guard let ownerUid = dictionary["fromId"] as? String else { return }

        Database.fetchUser(with: ownerUid, completion: { (user) in
            let user = User(dictionary: dictionary)
           // let user = User(postId: postId, user: user, dictionary: dictionary)
            completion(user)
        })
    }
}
}

ниже, как я планирую вызывать информацию из firebaseсохранить на мои уведомления ViewController.

var notifications = [userNotifications]()

override func viewDidLoad() {
    super.viewDidLoad()
  fetchNotifications()
 }

    func fetchNotifications() {
    guard let currentUID = Auth.auth().currentUser?.uid else { return }
    USER_SWIPES_REF.child(currentUID).observe(.value) { (snapshot) in
        print(snapshot)

        guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return }
        guard let uid = dictionary["userSwipeId"] as? String else { return }

       Database.fetchUser(with: uid, completion: { (user) in
            if let postId = dictionary["fromId"] as? String {

                Database.fetchPoster(with: postId, completion: { (poster) in
                    let notification = userNotifications(poster: poster, dictionary: dictionary)
                    self.notifications.append(notification)
                    self.tableView.reloadData()
                })
            }

      })

    }
}

И последнее, но не менее важное: вот мои структуры для пользователя и автора

// poster

init(dictionary: [String: Any]) {

    self.cost = dictionary["price"] as? String ?? ""
    self.description = dictionary["description"] as? String
    self.category = dictionary["category"] as? String ?? ""
    self.imageUrl1 = dictionary["imageUrl1"] as? String ?? ""
    self.imageUrl2 = dictionary["imageUrl2"] as? String
    self.imageUrl3 = dictionary["imageUrl3"] as? String
    self.fromId = dictionary["fromId"] as? String ?? ""
}

// user

    init(dictionary: [String: AnyObject]) {
    self.number = dictionary["phonenumber"] as? String
    self.id = dictionary["uid"] as? String
    self.name = dictionary["name"] as? String
    self.email = dictionary["email"] as? String
}

В моем уведомлении ViewController я публикую набор фиктивных данных, поэтому в numberOfRowsInsection будет возвращено сообщение «Пустой пользователь пролистал ваше сообщение» в зависимости от того, сколько пользователей пролистало.когда я устанавливаю возврат 5, он возвращает 5 фиктивных данных.В моей консоли я вижу оператор печати из firebase, показывающий, сколько пользователей прошло.Однако, когда я нажимаю на сам viewController, он просто пуст.Буду очень признателен, если кто-нибудь сможет мне помочь.

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