什么时候到.removeObserver?

时间:2017-03-28 20:59:35

标签: ios swift firebase swift3 geofire

该应用应仅加载本地发布的帖子。 使用GeoFire,在FB中有一个分支“posts_location”。 我想首先填充“nearbyPostsKeys”数组,然后从FB的分支帖子中加载那些具有参考REF_POSTS.

的帖子

viewDidLoad中,我调用了一个具有完成处理程序的func(来自FB的数据)。

这是获取完成处理程序的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'中调用func的方法:

 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个帖子,但发生了什么:

调用.observe。 1个帖子被检索并附加到附近的PostsKeys - &gt;调用完成处理程序。并传递带有1个元素的数组...并继续循环。

我希望我可以等到'nearbyPostsKeys'数组被填充,然后才将其作为完成处理程序传递。

我还了解了.removeObserver func可以阻止.observe func,但无论我把它放在哪里:

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

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

它看起来像附近的PostsKeys根本没有通过。

请就更好的逻辑或如何使用.removeObserver提出建议。 谢谢。

1 个答案:

答案 0 :(得分:1)

您应该在视图控制器取消初始化时删除观察者:

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

只需使circleQuery成为viewcontroller的属性。