Получить данные из нескольких узлов в Firebase в Swift - PullRequest
0 голосов
/ 12 ноября 2018

Я создал свое приложение для новостной ленты, такой как Facebook.Моя проблема в том, что я не знаю, как получить ребенка images в Post и показать его в collectionView.Пожалуйста, покажи мне, как это сделать.Цени любую помощь.

Вот структура БД:

Posts
   d7j3bWMluvZ6VH4tctQ7B63dU4u1:
       20181112101928:
          avatar: "https://platform-lookaside.fbsbx.com/platform/p..."
          content: "Funny image"
          images:
              -LR4vaEIggkGekc-5ZME:
                       "https://firebasestorage.googleapis.com/v0/b/hon..."
              -LR4vaENC-IsePibQYxY:                             
                       "https://firebasestorage.googleapis.com/v0/b/hon..."
          name: "Thành Trung"
          time: 1541992768776.3628
          type: "Funny"

Вот мой код:

   func getDataFromPostFirebase() {
        let getPostData = databaseReference.child("Posts")
        getPostData.observe(.childAdded) { (snapshot) in
            getPostData.child(snapshot.key).observe(.childAdded, with: { (snapshot1) in
                getPostData.child(snapshot.key).child(snapshot1.key).observe(.value, with: { (snapshot2) in
                    self.arrayImageUrl = [String]()
                    if let dict = snapshot2.value as? [String : Any] {
                        guard let avatar = dict["avatar"] as? String else {return}
                        guard let content = dict["content"] as? String else {return}
                        guard let name = dict["name"] as? String else {return}
                        guard let time = dict["time"] as? Double else {return}
                        guard let type = dict["type"] as? String else {return}
                        if let images = dict["images"] as? [String : String] {
                            for image in images.values {
                                self.arrayImageUrl.append(image)
                            }
                            let newPost = Post(avatarString: avatar, contentString: content, nameString: name, timeDouble: time, typeString: type)
                            self.arrayPost.append(newPost)
                            DispatchQueue.main.async {
                                self.feedTableView.reloadData()
                            }
                        } else {
                            let newPost = Post(avatarString: avatar, contentString: content, nameString: name, timeDouble: time, typeString: type)
                            self.arrayPost.append(newPost)
                            DispatchQueue.main.async {
                                self.feedTableView.reloadData()
                            }
                        }
                    }
                })
            })
        }
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return arrayImageUrl.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! TrangChu_CollectionViewCell

        cell.imgContent.layer.cornerRadius = CGFloat(8)
        cell.imgContent.clipsToBounds = true
        cell.imgContent.layer.borderWidth = 2
        cell.imgContent.layer.borderColor = #colorLiteral(red: 0.4756349325, green: 0.4756467342, blue: 0.4756404161, alpha: 1)

        let url = URL(string: arrayImageUrl[indexPath.row])
        cell.imgContent.sd_setImage(with: url, completed: nil)

        return cell
    }

Объект модели

import Foundation

class Post {
    var avatar : String
    var content : String
    var images : [String]?
    var name : String
    var time : Double
    var type : String

    init(avatarString : String, contentString : String, nameString : String, timeDouble : Double, typeString : String) {
        avatar = avatarString
        content = contentString
//        images = imagesString
        name = nameString
        time = timeDouble
        type = typeString
    }
}

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Добавьте это для доступа к вашим изображениям:

guard let images = dict["images"] as? [[String: Any]] { return }
let imagesString: [String] = []
for imageDict in images {
    for key in imageDict.keys {
        if let imageName = imageDict[key] as? String else {
        // here you access your image as you want
            imagesString.append(imageName)
        }
    }   
}

Затем при создании объекта записи вы используете imagesString, который мы создали:

let newPost = Post(avatarString: avatar, contentString: content, imagesString: imagesString, nameString: name, timeDouble: time, typeString: type)
0 голосов
/ 13 ноября 2018

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

Posts
   d7j3bWMluvZ6VH4tctQ7B63dU4u1:
      avatar: "https://platform-lookaside.fbsbx.com/platform/p..."
      content: "Funny image"
      images:
          -LR4vaEIggkGekc-5ZME: "https://firebasestorage.googleapis.com/v0/b/hon..."
          -LR4vaENC-IsePibQYxY: "https://firebasestorage.googleapis.com/v0/b/hon..."
      name: "Thành Trung"
      time: 1541992768776.3628
      type: "Funny"
      timestamp: 1540276959924

Я удалил узел временной метки и перенес его вдоль дочернего узла. Теперь вы можете получать сообщения с этим.

ref.child("Posts").observe(.childAdded) { (snapshot) in
        var post = Post()

        let val = snapshot.value as! [String: Any]
        post.name = val["name"] as? String

        self.ref.child("Posts").child(snapshot.key).child("images").observeSingleEvent(of: .value, with: { (snap) in
            post.imagesString = [String]()
            for image in snap.children.allObjects as! [DataSnapshot] {
                post.imagesString?.append(image.value as! String)
                print("images \(image.value)")
            }

            list.append(post)
            print("post \(post)")
        })

Если вы хотите заказать записи, вы можете добиться этого с помощью queryOrderedByChild ("timestamp")

0 голосов
/ 12 ноября 2018

Вы можете получить значения изображений, используя это

ref.child("Posts").observe(.childAdded) { (snapshot) in

        self.ref.child("Posts").child(snapshot.key).observe(.childAdded, with: { (snapshot1) in
            self.ref.child("Posts").child(snapshot.key).child(snapshot1.key).child("images").observe(.childAdded, with: { (snap) in
                let post = new Post()
                for rest in snap.children.allObjects as! [DataSnapshot] {
                    //append images 
                    post.imagesString.append(rest.value)
                }


                post.avatarString = snapshot1.value["avatar"] as? String
                ...
            })
        })

Я предлагаю вам изменить структуру вашей БД, потому что она вложенная.См. здесь

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