Reputation: 43
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
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