2017-05-10 4 views
0

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.

+0

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 –

+0

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. –

+0

Der vollständige Code wurde hinzugefügt. Danke –

Antwort

0

Ich nehme an, dass wenn die Aktualisierung aktiviert ist, diese Funktion aufgerufen wird und alle Beiträge heruntergeladen werden. Bei Ihrem doppelten Problem scheint es so zu sein, dass Sie Daten an Ihr posts-Array anhängen, ohne die alten Daten zu entfernen.

ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snap) in 

    let postsSnap = snap.value as! [String : AnyObject] 

    self.posts.removeAll() // This will remove previously downloaded posts. 

    // All your other code ... 
Verwandte Themen