Быстрый поиск по базе данных - одна перезагрузка - PullRequest
0 голосов
/ 26 октября 2019

У меня есть функция поиска в моем приложении, которая работает отлично, за исключением того факта, что она, кажется, одна перезагрузка позади. Например, если я введу 'S', ничего не отобразится, но если я введу 'a' после того, как появятся все результаты для 'S'. Я попытался добавить перезагрузку collectionView в конце функции выборки, но если я это сделаю, то ничего не отобразится.

@objc func textFieldDidChange(_ textField: UITextField) {
    guard let text = textField.text else { return }

    if text.count == 0 {
        self.posts.removeAll()
        self.filteredPosts.removeAll()
    } else {
        fetchSearchedPosts(searchTerm: text)
    }
    self.collectionView.reloadData()
}

func fetchSearchedPosts(searchTerm: String) {
    self.collectionView.refreshControl?.endRefreshing()

    let ref = Database.database().reference().child("posts").queryOrdered(byChild: "title").queryStarting(atValue: searchTerm).queryEnding(atValue: "\(searchTerm)\u{f8ff}")
    ref.observeSingleEvent(of: .value) { (snapshot) in

        if !snapshot.exists() { return }

        guard let dictionaries = snapshot.value as? [String: Any] else { return }
        self.posts.removeAll()
        dictionaries.forEach({ (key, value) in

            guard let postDictionary = value as? [String: Any] else { return }
            guard let uid = postDictionary["uid"] as? String else { return }

            Database.fetchUserWithUID(uid: uid, completion: { (user) in

                let post = Post(postId: key, user: user, dictionary: postDictionary)

                let nowTimeStamp = Date().timeIntervalSince1970
                let dateTime = post.endTimeDate
                let timeStamp = dateTime.timeIntervalSince1970

                    if nowTimeStamp < timeStamp {

                    post.id = key
                    self.posts.append(post)

                    } else {
                        return
                    }
            })
            self.posts.sort(by: { (post1, post2) -> Bool in
                return post1.title.compare(post2.title) == .orderedAscending
            })
        })
        self.collectionView.reloadData()
    }
}

1 Ответ

1 голос
/ 26 октября 2019

Вам нужно DispatchGroup, поскольку вы вложили асинхронные вызовы

func fetchSearchedPosts(searchTerm: String) {

    self.collectionView.refreshControl?.endRefreshing() 
    let ref = Database.database().reference().child("posts").queryOrdered(byChild: "title").queryStarting(atValue: searchTerm).queryEnding(atValue: "\(searchTerm)\u{f8ff}")
   ref.observeSingleEvent(of: .value) { (snapshot) in

    if !snapshot.exists() { return }

    guard let dictionaries = snapshot.value as? [String: Any] else { return }
    self.posts.removeAll()
    let g = DispatchGroup()   ///// 1

    dictionaries.forEach({ (key, value) in

        guard let postDictionary = value as? [String: Any] else { return }
        guard let uid = postDictionary["uid"] as? String else { return }

        g.enter()   ///// 2
        Database.fetchUserWithUID(uid: uid, completion: { (user) in

            let post = Post(postId: key, user: user, dictionary: postDictionary)

            let nowTimeStamp = Date().timeIntervalSince1970
            let dateTime = post.endTimeDate
            let timeStamp = dateTime.timeIntervalSince1970

                if nowTimeStamp < timeStamp {

                    post.id = key
                    self.posts.append(post)

                } else {
                    g.leave()   ///// 3.a
                    return
                }
            g.leave()   ///// 3.b
        })
    })

    g.notify(queue:.main) {    ///// 4
      self.posts.sort(by: { (post1, post2) -> Bool in
           return post1.title.compare(post2.title) == .orderedAscending
       })  
       self.collectionView.reloadData()
     }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...