2016-04-11 54 views
11

'daki değer değişiminden sonra gözlemciyi kaldırın ViewController'da global bir gözlemcim var ve aşağıdaki gibi belirli değerler için içinde farklı gözlemciler var. Değer değiştikten sonra gözlemciyi çıkarmak mümkün mü?Firebase

var ref = Firebase(url: "https://<FIREBASE-APP>.firebaseio.com/") 

let handle = ref.observeEventType(.Value, withBlock: { snapshot in 

    //Here VALUE Changes to NEW_VALUE 
    if snapshot.value as! String == NEW_VALUE { 

     //IS IT POSSIBLE TO REMOVE HANDLE HERE???? 
     ...something here 
    } 

}) 

//NOT HERE 
...ref.removeObserverWithHandle(handle) 
+0

ref.observeSingleEventOfType? – mrkbxt

+0

observeSingleEventOfType sadece bir kerelik bir gözlem-sorgu gibi gözlemler ve sonra kendini kaldırır. Değeri her zaman gözlemlemeliyim, değişene kadar ve daha sonra –

+0

'u kaldırabilirsiniz. belirli değerler için farklı gözlemciler? Sorunuzda, söz konusu düğümün herhangi bir yerine düzenleme eklemek veya etkinliği kaldırmak için tüm uygulama düğümünüz olan .value ile gözlemliyorsunuz. Bir değişiklik varsa, anlık görüntü bir dizeyle karşılaştırılamayacak olan bu düğümün içindeki * herşeyi * (tüm çocuk düğümleri, çocukları vb.) Döndürür. Ancak, eğer kolu kaldırabilseniz bile, uygulama düğümü artık herhangi bir değişiklik için gözlenmeyecektir. Sorunuzu hassaslaştırabilir misiniz lütfen? – Jay

cevap

24

o güvenle bloğun içine handle erişebilir fark etmez, bu durum size Swift fazladan bir adım atmak gerekir vakaların biridir. Bu çevrede çalışma

Tek yoludur:

let ref = Firebase(url: "https://yours.firebaseio.com/") 
var handle: UInt = 0 
handle = ref.observeEventType(.Value, withBlock: { snapshot in 
    print(snapshot) 
    if snapshot.exists() && snapshot.value as! String == "42" { 
     print("The value is now 42") 
     ref.removeObserverWithHandle(handle) 
    } 
}) 

açıkça handle değişkeni başlatılıyor ederek, Swift derleyici hata kaldırın. Ancak, bloğumuzun çağrılmasından önce tanıtıcının yerleştirileceği göz önünde bulundurulduğunda, bloğun içine ref.removeObserverWithHandle(handle) güvenli bir şekilde çağrı yapabiliriz.

+0

Tam olarak ihtiyacım olan şey, Teşekkürler Frank !!!! –

+1

. Değer, tüm değerleri düğümle döndüreceğinden bir soruna neden olacak bir dizge ile karşılaştırılamayacak bir sözlük yapısı olurdu.Aynı zamanda snapshot.children içindeki bir çocuk için bunu yapardı.Ayrıca, bir değişikliği gözlemlemek istiyorsak, sadece bir ref gerek yok, bir sapa gerek yok. bloğun içindeki removeAllObservers. :-) – Jay

+0

@Jay. Ancak ref.removeAllObservers() 'ı çağırmaktan çekinmiyorum. Bu (adından da anlaşılacağı gibi), aynı olmayan * tüm * gözlemcileri kaldıracaktır. Bu basit snippet için işe yarayabilse de, genelde dinleyicileri eklemek ve onları kaldırmak arasında bir simetri olmasını tercih ediyorum, –