Сообщения, загружаемые для всех пользователей в коллекционном представлении firebase & swift - PullRequest
0 голосов
/ 23 ноября 2018

Все, что я пытаюсь сделать, это извлечь все сообщения в представление коллекции, которые находятся в пределах определенного радиуса текущего пользователя.В настоящее время я получаю все сообщения текущих пользователей в этом месте, но это все.Я не могу понять, как преобразовать его, чтобы получить все сообщения от всех пользователей.

FetchPostUserIds Возвращает снимок всех пользователей и там UID

GeoFireзапрос только возвращает postId от текущего пользователя.Это не должно быть, я предполагаю

Примечание: обновленный код

var PostKey: String?
var geoFire: GeoFire?
var regionQuery: GFRegionQuery?
var foundQuery: GFCircleQuery?
var geoFireRef: DatabaseReference!

override func viewDidLoad() {
    super.viewDidLoad()

    guard let uid = Auth.auth().currentUser?.uid else { return }
    geoFireRef = Database.database().reference().child("posts").child(uid)
    geoFire = GeoFire(firebaseRef: geoFireRef)

}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    let userLocation: CLLocation = locations[0] as CLLocation
    let currentUserLocation = userLocation

    let circleQuery = geoFire?.query(at: currentUserLocation, withRadius: 100.0)
    _ = circleQuery?.observe(.keyEntered, with: { (key, location) in
        self.PostKey = key
        self.locationManager.stopUpdatingLocation()
    })
}

 fileprivate func fetchPostsWithUser(user: User) {

    guard let key = PostKey else { return }

    let ref = Database.database().reference().child("posts").child(user.uid).child(key)
    ref.observeSingleEvent(of: .value, with: { (snapshot) in
        self.collectionView?.refreshControl?.endRefreshing()

        guard let dictionary = snapshot.value as? [String: Any] else { return }

        var post = Post(user: user, dictionary: dictionary)
        post.id = key

        self.posts.append(post)
        self.posts.sort(by: { (post1, post2) -> Bool in
            return post1.creationDate.compare(post2.creationDate) == .orderedDescending
        })
        self.collectionView?.reloadData()
    }) { (error) in
        print(error)
    }

}

fileprivate func fetchPostUserIds() {

    let ref = Database.database().reference().child("users")
    ref.observeSingleEvent(of: .value, with: { (snapshot) in

        guard let userIdKey = snapshot.value as? [String: Any] else { return }

        userIdKey.forEach({ (key, value) in
            Database.fetchUserWithUID(uid: key, completion: { (user) in
                self.fetchPostsWithUser(user: user)
            })
        })

    }) { (error) in
        print(error)
    }

}

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Попробуйте отладить и посмотреть, что вы получили в моментальном снимке в вашей функции, а также что fetchUserWithUID возвращает

fileprivate func fetchPostUserIds() {

     let ref = Database.database().reference().child("users")
        ref.observeSingleEvent(of: .value, with: { (snapshot) in

            guard let userIdKey = snapshot.value as? [String: Any] else { return }

            userIdKey.forEach({ (key, value) in
            Database.fetchUserWithUID(uid: key, completion: { (user) in
                self.fetchPostsWithUser(user: user)
            })
        })

    }) { (error) in
        print(error)
    }

}

Может быть, с какой-то дополнительной информацией я могу помочь вам

0 голосов
/ 23 ноября 2018

Вы передаете paremeter user: User методу fetchPostsWithUser, но всегда используете текущего пользователя

guard let uid = Auth.auth().currentUser?.uid else { return }

, также обратите внимание, что эти

let ref = Database.database().reference().child("users")
ref.observe(.value, with: { (snapshot) in

будут загружать каждое изменение, поэтому подумайте оsingleObserve

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...