Как получить сообщения пользователей, добавить их со снимками в табличное представление - Swift - PullRequest
0 голосов
/ 22 декабря 2018

Итак, я пытаюсь получить информацию о подписчиках пользователей в массиве.Затем с помощью этого массива получите сообщения каждого пользователя, а затем добавьте их в мое табличное представление.В течение всего этого я хотел бы добавить прослушиватель снимков, чтобы, если пользователю понравилась запись, число автоматически обновлялось.Когда я делаю это, он добавляет каждое обновление, поэтому один пост будет показан примерно 5 раз после того, как будет выполнено какое-либо действие, подобное тому, которое я не хочу.Может ли кто-нибудь помочь мне понять это?Я использую Xcode Swift.Заранее спасибо!

class Posts {
    var postArray = [UserPost]()
    var db: Firestore!
    init() {
        db = Firestore.firestore()
    }
    func loadData(completed: @escaping () -> ()) {
        let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: Date())
        self.postArray = []
        guard let user = Auth.auth().currentUser else { return }
        let displayUsername = user.displayName
        let userReference = db.collection("Users").document("User: \(displayUsername!)").collection("Connect").document("Following")
        userReference.getDocument { (document, error) in
            if let documentData = document?.data(),
                var FollowerArray = documentData["Following"] as? [String] {
                FollowerArray.append(displayUsername!)
                FollowerArray.forEach {
                    self.db.collection("Users").document("User: \($0)").collection("Posts").whereField("timeOfPost", isGreaterThanOrEqualTo: sevenDaysAgo!)
                        .addSnapshotListener { (querySnapshot, error) in
                            guard error == nil else {
                                print("*** ERROR: adding the snapshot listener \(error!.localizedDescription)")
                                return completed()
                            }
                            //self.postArray = []
                            // there are querySnapshot!.documents.count documents in the posts snapshot
                            for document in querySnapshot!.documents {
                                let post = UserPost(dictionary: document.data())
                                self.postArray.append(post)
                            }
                            completed()
                    }
                }
}

1 Ответ

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

Я бы предложил другой подход и позволил бы Firestore сообщать вам, когда дочерние узлы (сообщения) были добавлены, изменены или удалены.Основываясь на вашем коде, ваша структура выглядит примерно так:

Users
  uid
    //some user data like name etc
    Posts
      post_0
        likes: 0
        post: "some post 0 text"
      post_1
        likes: 0
        post: "text for post 1"

Давайте создадим класс для хранения сообщения в

class UserPostClass {
    var postId = ""
    var postText = ""
    var likes = 0

    init(theId: String, theText: String, theLikes: Int) {
        self.postId = theId
        self.postText = theText
        self.likes = theLikes
    }
}

, а затем массив для хранения UserPosts, который будетtableView dataSource

var postArray = [UserPostClass]()

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

func populateArrayAndObservePosts() {
    let uid = "uid_0" //this is the logged in user
    let userRef = self.db.collection("users").document(uid)
    let postsRef = userRef.collection("Posts")
    postsRef.addSnapshotListener { documentSnapshot, error in
        guard let snapshot = documentSnapshot else {
            print("err fetching snapshots")
            return
        }

        snapshot.documentChanges.forEach { diff in
            let doc = diff.document
            let postId = doc.documentID
            let postText = doc.get("post") as! String
            let numLikes = doc.get("likes") as! Int

            if (diff.type == .added) { //will initially populate the array or add new posts
                let aPost = UserPostClass(theId: postId, theText: postText, theLikes: numLikes)
                self.postArray.append(aPost)
            }

            if (diff.type == .modified) { //called when there are changes
                //find the post that was modified by it's postId
                let resultsArray = self.postArray.filter { $0.postId == postId }
                if let postToUpdate = resultsArray.first {
                    postToUpdate.likes = numLikes
                }
            }

            if (diff.type == .removed) {
                print("handle removed \(postId)")
            }
        }
        //this is just for testing. It prints all of the posts
        // when any of them are modified
        for doc in snapshot.documents {
            let postId = doc.documentID
            let postText = doc.get("post") as! String
            let numLikes = doc.get("likes") as! Int
            print(postId, postText, numLikes)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...