2017-03-28 61 views
0

該應用只能加載本地發佈的帖子。 使用GeoFire a在FB中有一個分支「posts_location」。 我想先填充「nearbyPostsKeys」陣列,然後加載從FB的分支帖子的具體職位,具有一定的參考REF_POSTS.何時.removeObserver?

viewDidLoad,我呼籲,有一個完成處理程序(從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) 
    }) 
} 

這裏就是我的呼籲是FUNC在「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。 謝謝。

回答

1

當您的視圖控制器deinitializes您應該刪除觀察員:

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

只是要circleQuery您的視圖 - 控制的屬性。

+0

如果你這樣做了,你必須確保你讓觀察者變弱:with:{[weak self](key,location)in,否則觀察者留在內存中,並且檢查:if newRefHandle! = nil {circleQuery!.removeObserver(withFirebaseHandle:newRefHandle)} –

相關問題