Сообщений, загружаемых случайным образом в виде коллекции - Swift & Firebase - PullRequest
0 голосов
/ 15 ноября 2018

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

Всякий раз, когда я добавляю новое сообщение в представление коллекции , оно добавляется в случайную ячейку и выходит из строя , а не в первом сообщении.

Я знаю, что причина в функции fetchuser и из того, что мне говорят из-за асинхронной загрузки, но не знаю, что делать, чтобы исправить это.

Может ли кто-нибудь помочь мне разобраться, что делать, чтобы мои сообщения добавлялись в первую ячейку?

 @objc func observePostsAdoption() {
    let postsRef = Database.database().reference().child("posts")
    postsRef.queryOrdered(byChild: "postType").queryEqual(toValue: "adopt").observe(.value) { (snapshot) in
        var tempPost = [Posts]()
        for child in snapshot.children {
            if let childSnapshot = child as? DataSnapshot {
                let dict = childSnapshot.value as? [String: Any]
                let newAdoptiondPost = Posts.transformPost(dict: dict!)
                //This will look up all users at once
                self.fetchUser(userid: newAdoptiondPost.userid!, completed: {
                 tempPost.insert(newAdoptiondPost, at: 0)
                    DispatchQueue.main.async {
                        self.postsadoption = tempPost
                        self.adoptionCollectionView.reloadData()
                        self.refresherAdoption.endRefreshing()
                    }
            })
            }

        }
    }
}

func fetchUser(userid: String, completed:  @escaping ()-> Void ) {

    Database.database().reference().child("users").child(userid).observeSingleEvent(of: .value) { (snapshot) in
        if let dict = snapshot.value as? [String: Any] {
            let user = UserProfile.transformUser(dict: dict)
            self.users.insert(user, at: 0)
            completed()
        }
    }

}

Вот моя структура сообщений

class Posts {

//UserView
var uid: String?
var author: UserProfile?
var timestamp: Date?
var userid: String?

func getDateFormattedString() -> String {
    let formatter = DateFormatter()
    formatter.dateFormat = "MMM d, HH:mm"
    return formatter.string(from: self.timestamp!)
}

//Image
var photoUrl: URL?

//PostInformation View
var city: String?
var municipality: String?
var name: String?
var breed : String?
var phone : String?
var address : String?
var petType: String?
var genderType: String?
var comments: String?

}

добавочные посты {

static func transformPost(dict: [String: Any]) -> Posts {

    let post = Posts()

    //Post Picture
    let photoUrl = dict["photoUrl"] as? String
    post.photoUrl = URL(string: photoUrl!)

    //INFO POSTS
    post.userid = dict["userid"] as? String
    post.city = dict["city"] as? String
    post.municipality = dict["municipality"] as? String
    post.name = dict["name"] as? String
    post.breed = dict["breed"] as? String
    post.phone = dict["phone"] as? String
    post.address = dict["address"] as? String
    post.comments = dict["comments"] as? String
    post.petType = dict["petType"] as? String
    post.genderType = dict["gender"] as? String
    let timestamp = dict["timestamp"] as? Double
    post.timestamp = Date(timeIntervalSince1970: timestamp!/1000)

    return post

}

}

1 Ответ

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

Если у вас уже есть посты, упорядоченные по типу поста, вы можете просто выполнить сортировку в зависимости от отметки времени.Например,

@objc func observePostsAdoption() {
        let postsRef = Database.database().reference().child("posts")
        postsRef.queryOrdered(byChild: "postType").queryEqual(toValue: "adopt").observe(.value) { (snapshot) in
            var tempPost = [Posts]()
            for child in snapshot.children {
                if let childSnapshot = child as? DataSnapshot {
                    let dict = childSnapshot.value as? [String: Any]
                    let newAdoptiondPost = Posts.transformPost(dict: dict!)
                    //This will look up all users at once
                    self.fetchUser(userid: newAdoptiondPost.userid!, completed: {
                        tempPost.insert(newAdoptiondPost, at: 0)
                        DispatchQueue.main.async {
                            self.postsadoption = tempPost
                            self.postsadoption.sort { (p1, p2) -> Bool in
                                return p1.timeStamp?.compare(p2.timeStamp!) == .orderdDescending
                            }
                            self.adoptionCollectionView.reloadData()
                            self.refresherAdoption.endRefreshing()
                        }
                    })
                }

            }
        }
    }

При этом массив принятия сообщений будет отсортирован в зависимости от вашей временной отметки.

...