Wenn ich die Sammlung aktualisieren, die Daten dupliziert um +1 in meinem Array. Wie kann ich doppelte Einträge in meinem Array vermeiden, wenn ich diese Funktion auffrische? Auch verwendet self.posts.removeAll() noch kein Ergebnis.Firebase observeSingleEvent kontinuierlich doppelten Eintrag in meinem Array angefügt werden
var posts = [Post]() {
didSet {
collectionView?.reloadData()
}
}
var following = [String]()
let refreshControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
refreshControl.tintColor = UIColor.gray
refreshControl.addTarget(self, action: #selector(fetchPosts), for: UIControlEvents.valueChanged)
collectionView?.addSubview(refreshControl)
collectionView?.alwaysBounceVertical = true
fetchPosts()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.collectionView.reloadData()
}
func fetchPosts(){
let ref = FIRDatabase.database().reference()
ref.child("users").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in
guard let users = snapshot.value as? [String : AnyObject] else {
return
}
print(snapshot.key)
for (_,value) in users {
if let uid = value["uid"] as? String {
if uid == FIRAuth.auth()?.currentUser?.uid {
if let followingUsers = value["following"] as? [String : String]{
for (_,user) in followingUsers{
self.following.append(user)
print(user)
}
}
self.following.append(FIRAuth.auth()!.currentUser!.uid)
ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snap) in
for postSnapshot in snap.children.allObjects as! [FIRDataSnapshot] {
let post = postSnapshot.value as! [String : AnyObject]
print(snap.key)
if let userID = post["userID"] as? String {
for each in self.following {
if each == userID {
print(each)
let posst = Post()
if let date = post["date"] as? Int, let author = post["author"] as? String, let likes = post["likes"] as? Int, let pathToImage = post["pathToImage"] as? String, let postID = post["postID"] as? String {
posst.date = Int(date)
posst.author = author
posst.likes = likes
posst.pathToImage = pathToImage
posst.postID = postID
posst.userID = userID
print(posst)
if let people = post["peopleWhoLike"] as? [String : AnyObject] {
for (_,person) in people {
posst.peopleWhoLike.append(person as! String)
}
}
var postExist:Bool = false
for post in self.posts {
if post.postID == posst.postID {
postExist = true
break
}
}
if !postExist {
self.posts.append(posst)
}
self.posts.sort(by: {$0.date! > $1.date!})
self.refreshControl.endRefreshing()
}
}
}
self.collectionView.reloadData()
}
}
})
}
}
}
})
ref.removeAllObservers()
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return posts.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: PostCell.identifier, for: indexPath) as! PostCell
cell.posts = posts[indexPath.row]
let post = posts[indexPath.row]
for person in post.peopleWhoLike {
if person == FIRAuth.auth()!.currentUser!.uid {
cell.like.isHidden = true
cell.unlike.isHidden = false
break
}
}
return cell
}
}
mit den Lösungen aktualisiert.
Konnte es mit Datum wie diesem self.posts.sort sortieren (durch: {$ 0.date!> $ 1.date!}), Nachdem er die Daten in ein Array anfügt. Aber ich brauche immer noch Hilfe, um Duplikate zu vermeiden, wenn ich scroll, um die Sammlungsansicht neu zu laden. Danke –
Wenn meine Antwort unten Ihr Problem nicht löst, müssen Sie Ihren gesamten Ansichtscontroller hochladen, weil ein Teil Ihres Codes dafür fehlt, um dies zu verstehen. –
Der vollständige Code wurde hinzugefügt. Danke –