2017-03-06 25 views
2

ランキング(HackerNewsに似ています)の投稿に対して無限のスクロールを作成しようとしていますが、無限のスクロールをページ設定/作成するのに、大量のデータがある場合はFirebaseを使用します。Firebaseで大量のデータをページングする最も効率的な方法

私がやっているやり方は、すべてのデータを要求し、並べ替えてから、無限のスクロール感を作成するようにスクロールを制限することです。すべてのデータを要求しなくても、この無限のスクロールを作成する必要はありませんか?

この方法でわかる問題は、100K +のエントリがある場合、100K +のエントリを要求してソートする必要があり、それがうまくいかないことです。どんな助けでも大歓迎です!

答えて

2

投稿は投稿が作成されてからの経過時間に応じて計算される値なので、投稿が受け取ったスコアは実際には2つのオプションしかありません。すべての投稿を取得し、クライアント側のランキング(あなたの場合はオプションではない)を計算するか、投稿が更新されるたびにランキングを計算することができます。また、スウィフトで私の例を挙げています。この例のDBの

構造:

posts : { 
    $post: { 
    stats : { 
     score : scoreValue, 
     ranking : rankingValue, 
     createdAt : timestamp 
    } 
    } 
} 

具体的には、これは新しいポストが作成されたとき、あなたはそれをデフォルトのスコアを割り当てて、順位を計算するだろうことを意味します。

ランキングは今、あなたは、単にポストのランキングは最大のまま確認するために、今すぐ

postsRef.queryOrdered(byChild:"stats/ranking").queryLimited(toLast: x) 

または多分

ref.queryOrdered(byChild: "stats/ranking").queryEnding(atValue: "lowestScoreSoFar").queryLimited(toLast: x) 

を使用して上位xの投稿を取得することができ、データベースに格納されているので、スコアを更新するのと同じ操作(トランザクション)でランクを更新することができます。

ref.runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in 
    if var stats = currentData.value as? [String : Any] { 
    var score = stats["score"] as? Int 
    var createdAt = stats["createdAt"] as? Long 
    score += 1 
    var ranking = calculateRanking(score, createdAt) 
    stats["score"] = score 
    stats["ranking"] = ranking 
    currentData.value = stats 
    return FIRTransactionResult.success(withValue: currentData) 
    } 
    return FIRTransactionResult.success(withValue: currentData) 
}) { (error, committed, snapshot) in 
    if let error = error { 
    print(error.localizedDescription) 
    } 
} 

この方法の問題点は、スコアが高い投稿は誰も投票しないとトップに浮かぶことになります。これを処理するために、Hacker Newsはサーバー上でスクリプトを実行しているようだ。30秒ごとにトップxの1つのランダム投稿のランキングを更新する。サーバーを実行して、特定の状況に最も適した設定を確認する必要があります。

Hacker Newsに類似したアルゴリズムを使用している場合は、すべての投稿の評価が0に近づくため、ランダムに特定のしきい値以上の順位の投稿のランキングを更新できます。古いものと無関係なものは無視する)。あなたの答えのためのLaebens @Pieter

Hacker News Algorithm

More info on the algorithm

How often does Hacker News recalculate rankings

How Hacker News algorithm really works

+0

感謝。私はこの方法について考えました。しかし、私のポイントが生のポイントだけであって、ランク付けが時間と関連しているように(古いポストのランクが下がっているので)、このデータのページ付けはどうすればいいですか? – ndduong

+0

スコアはトランザクションのように増分されているのか、それとも計算されていますか? –

+0

とにかく、私は自分の答えを更新しました。 –

関連する問題