2016-05-24 19 views
0

Ich habe ein iPhone app, wo ich, wie viele Menschen zeigen wollen zur Zeit sehen Sie ein Element als solches:Wie kann ich die aktuelle Anzahl der Zuschauer eines Artikels verfolgen?

Currently viewing

ich tue, dass durch diese Transaktion ausgeführt wird, wenn die Menschen einen Blick (Rubymotion Code eingeben unten, aber funktioniert genau wie die Firebase iOS SDK):

listing_reference[:listings][self.id][:viewing_amount].transaction do |data| 
    data.value = data.value.to_i + 1 
    FTransactionResult.successWithValue(data) 
end 

Und wenn sie die Ansicht verlassen:

listing_reference[:listings][self.id][:viewing_amount].transaction do |data| 
    data.value = data.value.to_i + - 
    FTransactionResult.successWithValue(data) 
end 

Es funktioniert die meiste Zeit, aber manchmal läuft es schief. Die App stürzt ab, Leute verlieren Konnektivität oder ähnliche Dinge.

Ich habe "onDisconnect" untersucht, um dies zu lösen - https://firebase.google.com/docs/reference/ios/firebasedatabase/interface_f_i_r_database_reference#method-detail - aber von dem, was ich sehen kann, gibt es keine "inDisconnectRunTransaction".

Wie kann ich sicherstellen, dass die Ansichtsmenge in der Auflistung egal was?

Antwort

1

Eine Firebase-Datenbank-Transaktion wird als Compare-and-Set-Operation ausgeführt: Beim aktuellen Wert eines Knotens gibt Ihr Code den neuen Wert an. Dies erfordert mindestens einen Umlauf zwischen dem Client und dem Server, was bedeutet, dass es inhärent für onDisconnect() Operationen ungeeignet ist.

Der onDisconnect() Handler ist stattdessen eine einfache set() Betrieb: Sie angeben, wenn Sie den Handler anhängen, was den Betrieb schreiben Sie passieren soll, wenn der Server feststellt, dass der Client (entweder sauber oder wie in Ihrem Problemfall unfreiwillig) getrennt hat.

Die Lösung ist (wie es oft bei NoSQL-Datenbanken der Fall ist), ein Datenmodell zu verwenden, das sich elegant mit der Situation befasst. In Ihrem Fall scheint es am natürlichsten nicht speichern die Zählung der Zuschauer, sondern die uid eines jeden Betrachters:

itemViewers 
    $itemId 
    uid_1: true 
    uid_2: true 
    uid_3: true 

Jetzt können Sie die Anzahl der Zuschauer mit einem einfachen value Zuhörer erhalten:

ref.child('itemViewers').child(itemId).on('value', function(snapshot) { 
    console.log(snapshot.numChildren()); 
}); 

Und verwenden Sie die folgende onDisconnect() aufzuräumen:

ref.child('itemViewers').child(itemId).child(authData.uid).remove(); 

Beide Code-Snippets sind in JavaScript-Syntax, weil ich erst bemerkt habe, dass Sie Swift verwenden, nachdem Sie sie eingegeben haben.

+0

Danke. Ich vermutete, dass so etwas die Lösung sein würde. Können Sie mir sagen, ob onDisconnect narrensicher ist? Funktioniert es als eine Art Timer auf dem Firebase-Server und trennt die Verbindung automatisch, wenn die Verbindung vor mehr als einer Minute unterbrochen wurde? Oder wie funktioniert es, wenn die App plötzlich ausfällt und es keine Zeit gibt, eine Nachricht an Firebase zu senden? –

+0

Und noch eine Frage. Sagen wir, ich habe 10000 Leute, die den gleichen Gegenstand betrachten. Dann scheint es plötzlich ziemlich teuer zu sein, auf "itemViewers" nach Änderungen zu schauen. Ist das etwas, worüber ich mir Sorgen machen sollte? Einfach auf ein "viewers_amount" auf den Gegenstand selbst zu hören, scheint viel weniger kostspielig. Was sind deine Gedanken? –

+0

Wenn der Client die Verbindung ordnungsgemäß trennt, sendet er ein Schließsignal an den Server, und der Handler 'onDisconnect()' wird sofort ausgeführt.Wenn der Client einfach verschwindet, erkennt der Server dies, wenn der Socket abläuft (normalerweise ein paar Minuten, aber das kann variieren). –