Добавление поста и перезагрузка таблицы приводит к тому, что один и тот же пост дважды отображается в табличном представлении - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть приложение, которое изначально загружает сообщения пользователя при входе в систему. Сообщения отображаются в виде таблицы. Это работает правильно, и код для этого здесь:

func observePosts () {

    guard let uid = Auth.auth().currentUser?.uid else {
        return
    }

    let newPost = DataService.ds.REF_USERS.child("\(uid)").child("posts")
    newPost.observe(.value, with: { (snapshot) in
               self.posts = []
               if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
                   for snap in snapshot {
                       let postData = DataService.ds.REF_POSTS.child(snap.key)
                       postData.observe(.value, with: { (snapshot) in
                           if let postDict = snapshot.value as? Dictionary<String, AnyObject> {
                               let key = snapshot.key
                               let post = Post(postKey: key, postData: postDict)
                               self.posts.append(post)
                            print("POST - \(self.posts)")
                           }
                           self.feedTableView.reloadData()
                       })
                   } //self.feedTableView.reloadData()
               }

           })
}

Проблема заключается в том, что я добавляю новый пост в другой V C, а затем перезагружаю табличное представление. Когда я делаю это, мой новый пост появляется дважды в виде таблицы. Я полностью сбит с толку относительно того, как этот новый пост добавляется в массив дважды только при добавлении нового поста. Добавить новый почтовый индекс можно здесь:

@IBAction func postButtonPressed(_ sender: Any) {
        guard let postName = postName.text, postName != ""  else {
            print("Name must be entered")
            return
        }

        guard let postCategory = postCategory.text, postCategory != "" else {
            print("Category must be entered")
            return
        }

         guard let postSubCategory = postSubCategory.text, postSubCategory != "" else {
            print("Sub Category must be entered")
            return
        }

        guard let postPrice = postPrice.text, postPrice != "" else {
            print("Price must be entered")
            return
        }
        guard let img = newPostImage.image, imageSelected == true else {
            print("ERIC: An image must be selected")
            return
        }



        if let imageData = img.jpegData(compressionQuality: 0.2) {

            let imgUid = NSUUID().uuidString
            let metadata = StorageMetadata()
            metadata.contentType = "image/jpeg"
            let storageItem = STORAGE_BASE.child(imgUid)
            print("STORAGE ID: \(storageItem)")


            DataService.ds.REF_POST_IMAGES.child(imgUid).putData(imageData, metadata: metadata) { (metadata, error) in
                if error != nil {
                    print("ERIC: Unable to upload image to Firebasee torage")
                } else {
                    print("ERIC: Successfully uploaded image to Firebase storage")
                    DataService.ds.REF_POST_IMAGES.child(imgUid).downloadURL(completion: { (url, error) in
                        if error != nil {
                            print("ERROR in image \(error!)")
                            print("Error URL for image: \(String(describing: url))")
                            return
                        }
                        if url != nil {
                            self.postToFirebase(imgUrl: url!.absoluteString)
                            print("URL for image: \(String(describing: url))")
                        }
                    })
                }
            }
        }
        dismiss(animated: true, completion: nil)
        //performSegue(withIdentifier: "reloadFeed", sender: self)

    }

    func postToFirebase(imgUrl: String) {
        let post: Dictionary<String, AnyObject> = [
            "postTimeStamp":  [".sv" : "timestamp"] as AnyObject,
            "postName": postName.text! as AnyObject,
            "imageUrl": imgUrl as AnyObject,
            "postCategory": postCategory.text! as AnyObject,
            "postYear": postYear.text! as AnyObject,
            "postRating": postRating.rating as AnyObject,
            "postPrice": postPrice.text! as AnyObject,
            "postSubCategory": postSubCategory.text! as AnyObject,
            "uid": uid as AnyObject
        ]


        let firebasePost = DataService.ds.REF_POSTS.childByAutoId()
        firebasePost.setValue(post)
        let userPost = firebasePost.key

        print("Firebase Post: \(String(describing: firebasePost))")

        let newPost = DataService.ds.REF_USERS.child("\(uid!)").child("posts").child(userPost!)
        newPost.setValue(true)

    }

После добавления вышеуказанного поста новый пост добавляется дважды в мой массив постов и отображается дважды в виде таблицы. Если я закрою приложение и войду в систему, таблица отобразится правильно. viewDidLoad содержит:

РЕДАКТИРОВАТЬ: Добавление объявления массива сообщений

var posts = [Post]()


    override func viewDidLoad() {
        super.viewDidLoad()
        feedTableView.delegate = self
        feedTableView.dataSource = self
        observePosts()
    }

Я предполагаю, что есть проблема с функцией observePosts(), но я не могу понять, что именно вопрос есть. Есть идеи?

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