- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
该应用程序应仅加载本地发布的帖子。使用 GeoFire 在 FB 中有一个分支“posts_location
”。我想先填充“nearbyPostsKeys
”数组,然后从 FB 的分支帖子中加载那些引用 REF_POSTS.
在 viewDidLoad
中,我调用了一个具有完成处理程序(来自 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”中调用该函数的方式:
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 个帖子被检索并附加到 nearbyPostsKeys -> 完成处理程序被调用。并传递了包含 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)
看起来 nearbyPostsKeys 根本没有传递。
请就更好的逻辑或如何使用 .removeObserver
提出建议。谢谢。
最佳答案
当你的 View Controller 取消初始化时,你应该移除观察者:
deinit {
circleQuery!.removeObserver(withFirebaseHandle: newRefHandle)
}
只需将 circleQuery
设为您的 View Controller 的属性即可。
关于ios - 什么时候 .removeObserver ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43079839/
简短版本: -removeObserver:forKeyPath:有什么用? ? 为什么不总是使用 -removeObserver:forKeyPath:context: ? 长版 在开发 Cocoa
我想添加一个 View Controller 作为通知的观察者。 调用选择器方法时,我会提醒用户。我希望只有当此 View Controller 是顶 View Controller 时才会出现此警报
我有一个 UITextView 子类,我在其中添加了一个 NSNotificationCenter 观察器。但是我在哪里再次删除观察者呢? 我的代码: _textDidChangeNotificati
该应用程序应仅加载本地发布的帖子。使用 GeoFire 在 FB 中有一个分支“posts_location”。我想先填充“nearbyPostsKeys”数组,然后从 FB 的分支帖子中加载那些引用
我有下一个代码: @implementation SplashViewVC - (void)viewDidLoad { [super viewDidLoad]; self.splash
以下是否删除了所有按名称添加的 NSNotificationCenter.defaultCenter View ? NotificationCenter.default.removeObserver(
我创建了一个观察器来跟踪AVPlayer的“速率”。每当AVPlayer速率按预期变化时,都会显示观察者通知。但是,当我尝试在AVPlayer正在播放的项目上结束播放时删除观察者时,出现以下崩溃: *
当我注释掉... // [[NSNotificationCenter defaultCenter] removeObserver:self name:@"LoadRequestFromAppDel"
我有一个 View 可以像这样在 init 上观察自身的值: [self addObserver:self forKeyPath:@"focusPointOfInterestIndicator" op
我一直在观察一个值,直到用户注销。但是当我调用 self.ref.removeObserver(withHandle: self.handle) self.ref.removeAllObservers
我在事件线程中有一个通知中心: Poco::NotificationCentre nc; // publicly visible // (thread main loop which will p
通常我在 viewWillAppear 中添加我的观察者,并在 viewWillDisappear 中移除它们。在这种情况下,即使在 View 消失后,我也需要其中一名观察员继续,以便它可以完成一些工
这是我的观察事件代码: let databaseRef = FIRDatabase.database().reference() let query = databaseRef
-(void)viewDidAppear:(BOOL)animated { NSOperationQueue *mainQueue = [NSOperationQueue ma
基本上,我有一个 view1,它在某个时候调用 view2(通过 presentModalViewController:animated:)。当按下 view2 中的某个 UIButton 时,vie
众神将许多习惯空降到我与世隔绝的丛林村庄,例如: - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:s
我看过NSNotification addObserver/removeObserver 放在viewDidLoad/viewDidUnload , viewDidAppear/viewDidDisa
我遇到了从 NSNotificationCenter 中删除观察者的正确位置的问题 // DetailOfSomethingViewController @implementation DetailO
有各种与此主题相关的问题,但没有一个能回答我的问题。 我想在对象被释放时从对象中removeObserver。我正在使用 KVO,因为需要观察多个项目,而 NSNotification 在这种情况下会
我有一个带有按钮操作的 View Controller : @IBAction func MultiplayerButtonClick(sender: AnyObject) {
我是一名优秀的程序员,十分优秀!