应用程序应该只加载本地生成的帖子。
使用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'数组被填充,然后作为完成处理程序传递它。
我还学习了
viewDidLoad
func,它可以停止.removeObserver
func,但是不管我把它放在什么地方: 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/