2017-04-26 74 views
1

隨着removeObserver(withHandle斯威夫特卡倫特3,觀察者不viewDidDisappear刪除隨着火力地堡,斯威夫特removeObserver(withHandle不刪除觀察者

var query = FIRDatabaseQuery() 

var postRef: FIRDatabaseReference! 
var postRefHandle: FIRDatabaseHandle? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    postRef = baseRef.child("Posts") 
} 

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

    if postRefHandle != nil { 
     //try 1: 
     //postRef.removeObserver(withHandle: postRefHandle!) 

     //try 2: 
     //postRef.queryOrdered(byChild: "sortTimestamp").removeObserver(withHandle: postRefHandle!) 

     //try 3: 
     //query.removeObserver(withHandle: postRefHandle!) 
    } 
    //try 4: 
    //postRef.removeAllObservers() //works 
} 

func getPosts() 
{ 
    var count = 20 

    query = postRef.queryOrdered(byChild: "sortTimestamp") 

    postRefHandle = query.queryLimited(toFirst: UInt(count)).observe(.childAdded //etc. 
} 

於是,我就在viewDidDisappear的三種方法,但觀察者。不會刪除 嘗試3 query.removeObserver(withHandle:postRefHandle)通過回答Firebase, how do I return a handle so that I can call removeObserver?由Frank-VAN-puffelen

,做的工作是一個在嘗試4 任何理由列舉了爲什麼我不能只有一個用removeObserver刪除Observer(withHandle? (嘗試1 - 3)

此外,「query.queryLimited(toFirst:UInt(count))。observe(.childAdded」沒有從Firebase獲取最新的數據,我留下的印象是觀察總是得到更新的數據,而不是observeSingleEvent爲何不這樣做

任何建議都非常讚賞

+0

也許'postRefHandle'有問題。 –

+0

@ArchieGertsman你是什麼意思?手柄會出現什麼問題? –

+0

也許它是'nil',整個'if'塊沒有被執行。嘗試在塊中打印一些東西。 –

回答

2

如果你有下面的代碼:?

var postsRef: FIRDatabaseReference! 
var postRefHandle: FIRDatabaseHandle! 
var query = FIRDatabaseQuery() 

func addHandler() { 

    self.postsRef = self.ref.child("posts") 
    var count = 20 
    self.query = self.postsRef.queryOrdered(byChild: "sortTimestamp") 

    self.postRefHandle = self.query.queryLimited(toFirst: UInt(count)).observe(.childAdded, with: { snapshot in 
     print(snapshot) 
    }) 
} 

,並在以後的時間,你做這個功能

self.postsRef.removeObserver(withHandle: self.postRefHandle!) 

它刪除觀察者。這是測試代碼。

對於你的問題的第二部分:querySingleEvent和觀察做明智的數據相同的事情,但有不同的行爲。他們都將始終獲得最新數據 - 通過startAt,ENDAT,equalTo等

observeSingleEvent返回數據修改,不留一個觀察者,所以你 將不通知,如果該數據改變

觀察回報數據並將觀察者留在節點 ,並會通知您未來的更改。

.childAdded:當任何兒童被添加到節點 .childChanges:當任何孩子節點 .childRemoved改變:當一個孩子被刪除。

+0

我很感謝你的回答,我確實提出了這個問題,我嘗試過//嘗試3: //query.removeObserver(withHandle:postRefHandle!) –

+0

@PeterdeVries好吧,我說得太快而且錯誤,所以我更新了我的答案與測試代碼。 – Jay

+0

不知何故,當它在addHandler()塊本身中完全工作時,它似乎在我將其放入viewDidDisappear時發生作用(檢查viewDidAppear中的postRefHandle不打印)。如果我回到VC並訪問一個不同的ref,它會觸發postRef(打印不應該打印的東西)。當我使用postRef.removeAllObservers()時,它不會這樣做。但它迄今爲止工作。我的問題的第二部分。你是絕對正確的,我的問題是viewDidDisappear和viewDidLoad在VC中回來的時間。非常感激。 –

相關問題