Ryan Gosling
Ryan Gosling

Reputation: 43

Array Elements continously appended

Im querying from firebase and elements are returning properly. However when I search for something twice two elements appear. Which means two elements were appended to the array. Should be one and only one the thing that comes back from search. Two elements should not be there if I search twice.

 if self.postsArray.count == 0
           {
               self.postsArray.append(newPost!)


               self.filteredPosts = self.postsArray.filter { (post) -> Bool in
                   return post.title.lowercased().contains(stringValue.lowercased())

               }
               DispatchQueue.main.async {
                   self.exploreCollectionView?.reloadData()
               }

           }
           else
           {

               for post in self.postsArray
               {
                   if post.key == newPost?.key{

                       self.filteredPosts = self.postsArray.filter { (post) -> Bool in
                           return post.title.lowercased().contains(stringValue.lowercased())

                       }
                       DispatchQueue.main.async {
                           self.exploreCollectionView?.reloadData()
                       }
                       return
                   }
                   else
                   {
                       self.postsArray.append(newPost!)
                       //                            self.postsArray.sort(by: { (post1, post2) -> Bool in
                       //                                return post1.title.compare(post2.title) == .orderedAscending
                       //                            })

                       self.filteredPosts = self.postsArray.filter { (post) -> Bool in
                           return post.title.lowercased().contains(stringValue.lowercased())

                       }
                       DispatchQueue.main.async {
                           self.exploreCollectionView?.reloadData()
                       }

                   }

               }

           }

So Im asking nicely if someone could look at this and see where the error in my logic is that is making things be added to the filtered events array more than once

Upvotes: 1

Views: 30

Answers (1)

3stud1ant3
3stud1ant3

Reputation: 3606

I guess problem is in for loop , there whenever a new post is not equal you are appending the new post to the array, whereas it should only be appended once

So you can use filter to see if it contains newPost

so replace

for post in self.postsArray
               {
                   if post.key == newPost?.key{

                       self.filteredPosts = self.postsArray.filter { (post) -> Bool in
                           return post.title.lowercased().contains(stringValue.lowercased())

                       }
                       DispatchQueue.main.async {
                           self.exploreCollectionView?.reloadData()
                       }
                       return
                   }
                   else
                   {
                       self.postsArray.append(newPost!)
                       //                            self.postsArray.sort(by: { (post1, post2) -> Bool in
                       //                                return post1.title.compare(post2.title) == .orderedAscending
                       //                            })

                       self.filteredPosts = self.postsArray.filter { (post) -> Bool in
                           return post.title.lowercased().contains(stringValue.lowercased())

                       }
                       DispatchQueue.main.async {
                           self.exploreCollectionView?.reloadData()
                       }

                   }

with

let filteredArr = self.postsArray.filter { (post) -> Bool in
                           return post.key == newPost?.key
}

if filteredArr.count == 0 {
     //append
     self.postsArray.append(newPost!)
} 


 self.filteredPosts = self.postsArray.filter { (post) -> Bool in
                           return post.title.lowercased().contains(stringValue.lowercased())

                       }
                       DispatchQueue.main.async {
                           self.exploreCollectionView?.reloadData()
                       }

Upvotes: 1

Related Questions