2016-09-25 2 views
0

ユーザーがチャットを開くたびにユーザーのオンラインステータスを追加しようとしています。 ChatVCFirebaseチャットセットのユーザーのオンラインステータス

private func userIsOnline() { 

    // Firebase make this user online 
    firebaseLastSeen = Constants.getFirebaseOnlineStatus(SMBUser.getCurrentUser().getId()) 
    firebaseLastSeen.setValue("Online") 
} 

private func observerUserOnline(){ 
     firebaseLastSeen.observeEventType(.Value, withBlock: { snapshot in 
      print(snapshot.value) 
      self.userIsOnline() 
      }, withCancelBlock: { error in 
       print(error.description) 
     }) 
    } 

public static func getFirebaseOnlineStatus(userRef: String) -> FIRDatabaseReference{ 
    return FIRDatabase.database().reference() 
      .child("meta") 
      .child(userRef) 
      .child("last_seen") 
} 

このロジックは、私はその後、observerUserOnline()を削除した場合ので、毎回値が変わると、私は、再びOnlineに値を変更しています、私にとって非常に悪いように思わ値はOnlinelast_seenに更新されますが、ユーザーがチャットでオンラインであっても2-3秒後にはtime(unix format)に変更されています。

この問題に対処するより良い方法はありますか?

答えて

4

パブリッシュ・サブスクライブ・パターンを使用できます。パブリッシュ・サブスクライブ・パターンとは何かを理解しましょう。

パブリッシュ・サブスクライブ・メッセージの送信者、 と呼ばれる出版社は、加入者と呼ばれる 特定の受信者に直接送信するメッセージをプログラムしていないメッセージングパターンであるが、代わりの知識がなくてもクラスに パブリッシュされたメッセージを特徴付けますどの 加入者があれば、存在する可能性があります。同様に、サブスクライバは、1つまたは複数のクラスに の関心を表し、存在する場合はどのパブリッシャがあるかを知らずに、 という興味のあるメッセージのみを受信します。

出典:以下Wikipedia

RabbitMQ MQTT Adapterを使った例です:

は/トピック「/トピックにトピックにユーザAのアプリ「/トピック/ユーザー-A」、ユーザBのアプリを購読しますユーザ-b」を選択し、オンライン/オフラインステータスをトピック「/ topic/presence」にパブリッシュする。 "/ topic/presence"を購読するために、バックエンドサーバー上にプログラムを作成します。すべての更新がから来ている場合は、ここでユーザーAユーザーAに、すべての友人にこの道をアップデートを公開し、その後、ユーザBがユーザAのオフライン/オンラインアップデートを受信します

   User A    User B   PresenceListener 

Subscribe  /topic/user-a  /topic/presence /topic/presence 

Publish   /topic/user-b  /topic/presence friend list 

本当の挑戦を公開する方法であると言うことができます"オフライン"。 1つのケースは、インターネットがまだアクティブな状態でユーザーがアプリを閉じると、アプリはサーバーに「オフライン」ステータスを公開できますが、インターネットが機能しなくなるとどうなりますか?

「最後の遺言」(lwt)を通過します。クライアントがオフラインであるともはや公開することはできませんので、

LWT messages are not really concerned about detecting whether a client has gone offline or not (that task is handled by keepAlive messages). LWT messages are about what happens after the client has gone offline. 

LWTメッセージは、クライアントに代わってブローカーによってパブリッシュされるメッセージを定義するために活用することができます。

出典:http://tuanpm.net/what-is-mqtt/プレゼンスサービスに似た何かを持つサンプルソースコードについては

、あなたがhttps://github.com/AppLozic/Applozic-Android-SDK

のGithubで利用できる当社ApplozicチャットSDKコードをチェックアウトすることができます
関連する問題