У меня есть приложение, которое изначально загружает сообщения пользователя при входе в систему. Сообщения отображаются в виде таблицы. Это работает правильно, и код для этого здесь:
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()
, но я не могу понять, что именно вопрос есть. Есть идеи?