应用程序应该只加载本地生成的帖子。
使用GeoFire a在FB中有一个分支“posts_location”。
我想先填充“nearbyPostsKeys”数组,然后从FB的具有引用的分支帖子加载那些特定帖子
REF_POSTS.中,我调用具有完成处理程序(来自FB的数据)的func。
下面是接受完成处理程序的func声明:

func populateNearbyAndPassIt(completion:@escaping ([String])->()) {

    let theGeoFire = GeoFire(firebaseRef: DB_BASE.child("posts_location"))
    let location = CLLocation(latitude: Location.sharedInstance.currentLatitude, longitude: Location.sharedInstance.currentLongitude)
    let circleQuery = theGeoFire!.query(at: location, withRadius: 6.0)

     let newRefHandle: FIRDatabaseHandle = circleQuery!.observe(.keyEntered, with: { (key, location) in

        self.nearbyPostsKeys.append(key!)
        completion(self.nearbyPostsKeys)
    })
}

下面是我在“viewDidLoad”中调用该函数的方法:
 populateNearbyAndPassIt{(nearbyPostsKeys) in

        //populate 'posts' based on 'nearby..'

        for key in nearbyPostsKeys {
            let postRef = DataService.ds.REF_POSTS.queryOrdered(byChild: key)
            postRef.observe(.value, with: { (snapshot) in
                self.posts = []
                if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] {
                    for snap in snapshot {
                        if let postDict = snap.value as? Dictionary<String, AnyObject> {
                            let key = snap.key
                            let post = Post(postKey: key, postData: postDict)
                            self.posts.append(post)
                        }
                    }
                }
                self.posts.reverse()

                print("Zhenya: here are all local posts data: \(self.posts)")
            })
        }
    }

在指定位置有3个帖子时,发生了以下情况:
叫做观察。正在检索1个帖子并将其附加到nearbyPostsKeys->将调用完成处理程序。传递一个元素的数组。。。循环继续。
我希望我可以等到'nearbyPostsKeys'数组被填充,然后作为完成处理程序传递它。
我还学习了viewDidLoadfunc,它可以停止.removeObserverfunc,但是不管我把它放在什么地方:
    let newRefHandle: FIRDatabaseHandle = circleQuery!.observe(.keyEntered, with: { (key, location) in

        self.nearbyPostsKeys.append(key!)
        completion(self.nearbyPostsKeys)
    })
    circleQuery!.removeObserver(withFirebaseHandle: newRefHandle)

看来附近的邮递员根本没经过。
请就更好的逻辑或如何使用.observe提出建议。
谢谢您。

最佳答案

当视图控制器取消初始化时,应删除观察者:

deinit {
    circleQuery!.removeObserver(withFirebaseHandle: newRefHandle)
}

只需将circleQuery设置为viewcontroller的属性。

关于ios - 什么时候去.removeObserver?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43079839/

10-09 22:48