2016-10-28 9 views
0

私は簡単な達成システムを作りたいと思います。これを行う最善の方法は何でしょうか?私は青銅のような値を表示したいと思いますので、それが最善の方法だとは思わないしかし、今、私は成果を照会するために、次のように行いますが、このように私は他:真に等しいクエリ値

databaseRef.child("usersAchievements").child(currentUser.generalDetails.uid).observe(.childAdded, with: { (snapshot) in 


      if snapshot.value as? Int == 1{ 
       self.achievements.append(snapshot.key) 
      } 
      self.tableView.reloadData() 

     }){ (error) in 

     } 

青銅のようなバッジの種類を持つことができませんまたは金もtableviewの中にあるが、私はそれをどのように構造化すべきか見出すことができないので、今は不可能です。私はそのための良い答えを見つけることができないよう

allAchievements 
achievement1: 0 
achievement2: 0 


usersAchievements 
    uFC7QFuY5rTUzxnXYlClrKobaQP2 //UID 
    achievement1: true 
    achievement2: true 

allAchievements 
achievement1: 0 //e.g 0 is bronze and 1 is silver 
achievement2: 1 


usersAchievements 
    uFC7QFuY5rTUzxnXYlClrKobaQP2 //UID 
    achievement1 
     type: gold 
     username: true 
    achievement2 
     username: true 
     type: silver 

それとも、それはこのようにJSONを持っている方が良いです:

が、それはこのようなJSON構造体を持ってOKです。

私は成果にテーブルビュー内のようなものを見たいと茶色のドットは青銅、金または銀である:

enter image description here

+0

を取得します。 firebaseと1と0に真と偽を保存する必要があるかどうか尋ねていますか?あなたの質問を更新して、あなたが求めていることがより明確になることができますか? – Jay

+0

申し訳ありませんが、私は更新するつもりです。 –

+0

ブロンズ、シルバー、ゴールド以外の成果はありますか? – Jay

答えて

1

それはあなたの木もそれほど複雑になりので、私は2番目のオプションをお勧めします。個人的に私はそれをさらに屈折させます。

まず、allAchievementsノードを取り除きます。それはむしろ冗長なようです。あなたが利用可能なすべての異なる業績をユーザーに見せることを計画していない限り、私はそれを削除するだけです。ユーザーとしてプラス、私はブロンズの成果の1つとして、私は自動的に彼らのシルバーゴールドまたは何かを線に沿っていると思うと思う。しかし、開発者であっても、すべてのレベルを知っているので、単純にそれらをリストすることができます。全体として、私はノードを取り除くだろう。

第二に、私のような成果を構築しまう代わりに、あなたがこれを更新するとどうなります

usersAchievements 
uFC7QFuY5rTUzxnXYlClrKobaQP2 
bronze: true 
silver: true 

?二つの手段作成し、それぞれの新しいUUIDに対して

  1. 、あなたはデフォルトですべて達成ノードを作成し、それらにfalseの値を割り当てることができます。アチーブメントがロックされていない場合は、それぞれの値を更新するだけです。

    usersAchievements 
    uFC7QFuY5rTUzxnXYlClrKobaQP2 
    bronze: true // user earned this so its true 
    silver: false // not earned so false but node already exists 
    gold: false // not earned so false but node already exists 
    
  2. 新しい成果は、獲得ベースでのみ作成されます。

    usersAchievements 
    uFC7QFuY5rTUzxnXYlClrKobaQP2 
    bronze: true // only one earned by the user 
    

あなたは、単に各達成ノードを更新することになるので、最初のオプションが良いです。しかし、私はあなたが異なる成果をたくさん持っているときに、それがどんなに恐ろしい/複雑なものになるかを見ることができると思います。あなたは、ユーザーに関係のない多くのデータを持っています。

一方、第2のオプションでは、特定のユーザーに関連する情報があることが保証されていますが、作成オプションを把握しておく必要があります。

PS2番目のオプションを選択すると、ノードが空の場合に対処する必要があります。ユーザーはクライアント側でに成果を達成していません。

+0

私は彼らに1度の登録をしてから、成果が得られない場合はありません:Dしかし、私の業績は "歓迎"真実で、それは青銅の銀か金のようなものでなければならない。 –

+0

あなたの人生はさらに楽になります。その場合、 'welcome:true'を追加することができます。 – eshirima

+0

しかし、どのように私は歓迎業績が青銅のタイプのように構造化するのだろうか?そしてテーブルビューではドットの色はそれに依存します。 –

1

あなたの業績が動的であれば、それをノードに保存してオブザーバーを維持してください。追加したアチーブメントが新しい場合は、すべてのクライアントに通知されます。ルックアップとして使用するコードでは、これを使用して辞書(例:achievementDict)を設定します。

achievement_list 
    -Uom9a9smmpasdm 
     name: "Bronze" 
    -Jiaiisiask9jkm 
     name: "Silver" 
    -Ykmsimiaooooos 
     name: "Gold" 
    -IJij00mlso09m9 
     name: "Supa Dupa" 

は、ユーザーのために、あなたは持ち運びにくいリロイゴールドを持っており、SUPA DUPAですけど、自分のユーザノードこれにより

users 
    -Yiniasopksdpok 
     user_name: "Leroy Brown" 
     achievements: 
     -Ykmsimiaooooos: true 
     -IJij00mlso09m9: true 
    -JYimpoaosmoso 
     user_name: "Marco Polo" 
      achievements: 
     -Uom9a9smmpasdm: true 

以内にその成果への参照を保持し、マルコ・ポーロはシルバーです。

「Bronze」、「Silver」などの実績の名前を使用したい場合は、新しい成果が追加された場合に更新されるアプリの辞書に保持されます。

あなたのユーザーのリスト(または何でも)が表示されたら、キーでその辞書から各達成度を検索できます。

let achievementName = achievementDict["-IJij00mlso09m9"] 

は、この質問は非常に明確ではないSUPA DUPA

関連する問題