收藏集视图中随机上传的帖子-Swift和Firebase

时间:2018-11-15 20:26:43

标签: swift firebase asynchronous uicollectionview uicollectionviewcell

我一直在重构代码,现在在帖子方面遇到了麻烦。

每当我向收藏夹视图中添加新帖子时,就会将其随机添加到随机单元格中,并且顺序混乱,而不是在第一篇帖子中。

由于异步加载,我被告知原因是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 :(得分:0)

如果您已经按帖子类型对帖子进行排序,则可以根据时间戳进行排序。例如

@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()
                        }
                    })
                }

            }
        }
    }

这样,posts采用数组将根据您拥有的时间戳进行排序。