2016-09-06 16 views
0

各セルにイメージがあるテーブルがあり、カスタムテーブルビューのセルクラスにFirebase .observerを置くと、そのテーブルの各セルに対してオブザーバが実行されているとカウントされますか?テーブルセルのFirebaseオブザーバは、各インスタンスのオブザーバとしてカウントされますか?

10人のユーザーが10個のセルをそれぞれポストしていて、テーブルに100個のセルがある場合、firebaseは基本的にこれを100人のオブザーバーと同じものと見なしますか?この悪いデザインですか?

これを投稿した後、私はUITableViewsの仕組みについて考えていましたが、実際に画面に表示されていないセルが実際に観察者を走らせることはない可能性があります。この方法であれば、これは本当に便利で効率的です。私に教えてください。

答えて

0

まず、画面に表示されていないセルが実際には「存在しない」という点で正しいと思います。

一般に、スクロールするとき、tableview.dequeuereusablecellwithidentifierは生成されているすべての単一セルのコードを実行する必要があるため、セル自体(API呼び出し、レンダリングなど)の内部では何も集中したくありません。スクロールするときに目立つチョッパ/遅れが発生します(コンピュータは最近非常に速いのでシミュレータでは気付かないかもしれません)。

0
  1. デザインによっては、1人または複数のオブザーバーが存在する可能性があります。 FirebaseのobserveEventを呼び出すクラスのインスタンスを持っている場合は、Firebaseのデータベースとは別にオブザーバを持っていますが、これはおそらくメインのFIRDatabase.database.reference()を介してデータベースを接続しているためです。

  2. また、テーブルビューの実装方法によって異なります。 UITableViewCell documentationを見ることができます。特に、再使用可能なセルがある部分とreuseIdentifierがあります。このように実装すると、常にメモリ内に(画面上のセル数+ 1)割り当てられたセルのみが保持されます。つまり、同じ数のオブザーバを意味します。データベースの構造を考えると

0
{ 
    "users": { 
     1: { 
      "username": "david" 
     } 
    }, 
    "posts": { 
     1: { 
      "text": "Hello World!" 
     } 
    } 
    "user-posts": { 
     1: { 
      1: true 
     } 
    } 
} 

次のようになり、ユーザーのパスにChildAddedイベントを観察したいと思います。あなたのユーザーの投稿を観察したい子供(ユーザー)ごとにuser-posts/1は投稿IDのリストを表示します。これらのポストIDを使用して、キーごとにテーブルビューセルを設定し、完全なポストを確認できます。 posts/1。念頭に置いて、オブザーバーを作成したら、それを削除しない限り、セルが画面上にあるかどうかに関係なくリスニングし続けます。対応するTable View Delegateメソッドを使用して、セルの表示が終了したときにオブザーバを削除できます。

関連する問題