如何在 Swift 中为以下观察删除 GeoFire 句柄?

Posted

技术标签:

【中文标题】如何在 Swift 中为以下观察删除 GeoFire 句柄?【英文标题】:How to remove a GeoFire handle for the following observe in Swift? 【发布时间】:2017-01-03 18:21:59 【问题描述】:

这是一个针对 Swift、Firebase 和 Geofire 的问题。

我想知道如何在 Swift 中为以下观察者移除 GeoFire 句柄。

locationsEnd!.query(at: location, withRadius: 16.0).observe(GFEventType.init(rawValue: 0)!, with: (key, location) in

以下工作正常(在 viewDidDisappear 中):

locationsEnd?.firebaseRef.removeAllObservers()

但是使用句柄却没有:

var locationHandle: UInt = 0

override func viewDidDisappear(_ animated: Bool) 
    super.viewDidDisappear(animated)

    //following does not work:
    locationsEnd?.firebaseRef.removeObserver(withHandle: locationHandle)


func aroundMe(_ location: CLLocation)

        locationHandle = locationsEnd!.query(at: location, withRadius: 16.0).observe(GFEventType.init(rawValue: 0)!, with: (key, location) in

            //etc
        )

我已经按如下方式尝试了locationHandle,但没有成功:

var locationHandle = FirebaseHandle()
var locationHandle: FirebaseHandle = 0
var locationHandle: UInt!
var locationHandle: UInt = 0
var locationHandle = FIRDatabaseHandle()
var locationHandle: FirebaseHandle = 0

任何建议都会很棒,如前所述,我可以删除所有观察者,但在其他地方我只需要删除一个句柄。

【问题讨论】:

【参考方案1】:

locationHandle 在您的代码中被定义为一个 UInt,它需要是一个 FIRDatabaseHandle 所以

以下是删除 Firebase 句柄的示例

var myPostHandle : FIRDatabaseHandle?

func someFunc()

    myPostHandle = ref.child("posts").observeEventType(.childAdded,
      withBlock:  (snapshot) -> Void in

            let postBody = snapshot.value!["body"] as! String

    )


func stopObserving()

    if myPostHandle != nil 
        ref.child("posts").removeObserverWithHandle(myPostHandle)
    

对于 GeoFire,它更像这样

let geofireRef = FIRDatabase.database().reference()
let geoFire = GeoFire(firebaseRef: geofireRef)
let center = CLLocation(latitude: 37.7832889, longitude: -122.4056973)
var circleQuery = geoFire.queryAtLocation(center, withRadius: 0.6)

var queryHandle = circleQuery.observeEventType(.KeyEntered,
         withBlock:  (key: String!, location: CLLocation!) in
             //do something
)

然后要删除,使用

circleQuery.removeObserverWithFirebaseHandle(queryHandle)

【讨论】:

非常感谢您的回复。刚才试过了,好像没什么区别。我试过: var locationHandle: FIRDatabaseHandle? var locationHandle: FIRDatabaseHandle! var locationHandle = FIRDatabaseHandle() var locationHandle: FIRDatabaseHandle = 0 @PeterdeVries 在我的答案中添加了一些快速示例代码,经过测试。 非常感谢,事实上我在其他地方也有相同的结构,效果很好。问题在于移除 GeoFire 手柄。 removeAllObservers() 有效, removeObserver(withHandle: locationHandle) 无效。 @PeterdeVries 哎呀,我打字很快。请使用 removeObserverWithFirebaseHandle 而不是 removeObserverWithHandle。 我得到:“FIRDatabaseReference”类型的值没有成员“removeObserverWithFirebaseHandle”。试图将其更改为 removeObserver(WithFirebasehandle: locationHandle),但 swift 要求我像以前一样放置 (removeObserver(withHandle)

以上是关于如何在 Swift 中为以下观察删除 GeoFire 句柄?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 在 iOS 11 中为 NSAttributedString 添加删除线

如何在 Swift 中为 UIBarButtonItem 设置动作

如何在 Swift 中为 NSLayoutConstraint 设置动画?

如何在 Swift 中为导航栏添加阴影并隐藏边框?

Swift / Cocoa:如何观察文件夹的变化?

Swift,FIrebase - 无法通过 removeAllObservers 删除观察者