Как загрузить данные не в реальном времени в Firebase? - PullRequest
0 голосов
/ 16 января 2019

Мне нужно решить следующую проблему:

enter image description here

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

Это мой переподготовка:

// Refresher
func refresh() {
    refresher = UIRefreshControl()
    refresher.attributedTitle = NSAttributedString(string: "Aktualisieren")
    refresher.addTarget(self, action: #selector(DiscoveryViewController.refreshData) , for: UIControl.Event.valueChanged)
    tableView.addSubview(refresher)
}

@objc func refreshData(sender: Any) {
    loadTopPosts()
    refresher.endRefreshing()
}

И с этим я загружаю все сообщения:

func loadTopPosts() {
    ProgressHUD.show("Lade...", interaction: false)
    self.postArray.removeAll()
    self.tableView.reloadData()

    // Aktuelle Location des aktuell eingeloggten Users laden
    guard let currentUserUid = UserApi.shared.CURRENT_USER_ID else { return }
    let databaseRef = LocationApi.shared.geoRef
    databaseRef.getLocationForKey(currentUserUid) { (location, error) in
        if error != nil {
            ProgressHUD.showError("Posts konnten nicht geladen werden")
        } else if location != nil {
            print("Location for \(currentUserUid) is [\(location!.coordinate.latitude), \(location!.coordinate.longitude)]")

            // Alle Posts im vorgegebenen Umkreis laden
            let REF_GEO_POSTS = Database.database().reference().child("geolocation_posts")
            let geoRef = GeoFire(firebaseRef: REF_GEO_POSTS)
            // Lade den aktuell eingestellten Radius aus der Datenbank
            self.observeRadius(completion: { (radius) in
                let currentRadius = radius
            // Üperprüfe, welche Posts im Umkreis erstellt wurden
                let circleQuery = geoRef.query(at: location!, withRadius: Double(currentRadius)!)

            circleQuery.observe(.keyEntered, with: { (postIds, location) in

                self.observePost(withPostId: postIds, completion: { (posts) in
                    guard let userUid = posts.uid else { return }
                    self.observeUser(uid: userUid, completion: { (users) in
                        let postArray = UserPostModel(post: posts, user: users)
                        self.postArray.append(postArray)
                        self.postArray.sort(by: {$0.post!.secondsFrom1970! > $1.post!.secondsFrom1970!})
                        self.tableView.reloadData()
                        self.tableView.setContentOffset(CGPoint.zero, animated: true)
                        ProgressHUD.dismiss()

                    })
                })

                })
            })
            if self.postArray.count == 0 {
                ProgressHUD.dismiss()
            }
        } else {
            ProgressHUD.showError("Posts konnten nicht geladen werden")
        }
    }
}

Вот функции, где я передаю данные из базы данных:

let REF_POSTS = Database.database().reference().child("posts")
func observePost(withPostId id: String, completion: @escaping (PostModel) -> Void) {
    REF_POSTS.child(id).observeSingleEvent(of: .value) { (snapshot) in
        guard let dic = snapshot.value as? [String: Any] else { return }
        let newPost = PostModel(dictionary: dic, key: snapshot.key)
        completion(newPost)
    }
}

let REF_USERS = Database.database().reference().child("users")
func observeUser(uid: String, completion: @escaping (UserModel) -> Void) {
    REF_USERS.child(uid).observeSingleEvent(of: .value) { (snapshot) in
        guard let dic = snapshot.value as? [String: Any] else { return }
        let newUser = UserModel(dictionary: dic)
        completion(newUser)
    }
}

func observeRadius(completion: @escaping (String) -> Void) {
    guard let currentUserUid = UserApi.shared.CURRENT_USER_ID else { return }
    let REF_RADIUS = Database.database().reference().child("users").child(currentUserUid).child("radius")
    REF_RADIUS.observeSingleEvent(of: .value) { (radius) in
        let currentRadius = radius.value as? String
        completion(currentRadius!)
    }
}

Теперь я хочу отключить функцию реального времени (обновлять tableView, только если я обновляюсь). Поэтому, если я обновлюсь, все будет отображаться правильно.

Как решить эту проблему?

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 16 января 2019

Существует observe, который постоянно уведомляет каждый раз, когда в базе данных происходит обновление. И есть observeSingleEvent, который будет предоставлять вам данные только по запросу.

https://firebase.google.com/docs/database/ios/read-and-write

А также, ваша ссылка на Geofire будет постоянно уведомлять вас о каждом обновлении, если вы не хотите, чтобы это делалось, удалите его следующим образом:

"Если вы не заинтересованы в получении обновлений о новых / перемещающихся пользователях после первоначального запроса, это также отличный момент, чтобы удалить наблюдателя, позвонив по номеру removeObserverWithFirebaseHandle или removeAllObservers."

в вашем случае это сообщения, и это было упомянуто здесь: https://stackoverflow.com/a/50722984/8869493

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