2017-05-28 8 views
1

この質問は、Join different nodes to observe them at once with firebaseの後に続きます。非常によく似ているとお詫びしますが、私はプロジェクトでそれを解決するのに苦労しています。Swiftを使用してFirebaseを使用して2つの結合ノードを正しく観察する方法

私はいくつかの食材や財産を取得IngredientDataを持っている:

{ 
    "IngredientData": { 
    "-KkY92MUZNHXxg4ivGY7": { 
     "name": "Onions" 
    }, 
    "-KkY90e7dAgefc8zH3_F": { 
     "name": "Peas" 
    }, 
    "-KkY9-HWJANdfhmD-SJ-": { 
     "name": "Mushrooms" 
    }, 
    "-KkbWdomTYdpgEDLjC9w": { 
     "name": "Eggs" 
    }, 
    "-KkbXOECSCBNAcVaO9rp": { 
     "name": "Rice" 
    } 
    } 
} 

私はその後、RecipeDataを持って成分あるレシピと内部が含まれています。

{ 
    "RecipeData": { 
    "-KlApwz5Y-TK_9z1sV1i": { 
     "recipeName": "Fried Rice", 
     "ingredients": { 
     "-KkbWdomTYdpgEDLjC9w": true, 
     "-KkbXOECSCBNAcVaO9rp": true, 
     "-KkY90e7dAgefc8zH3_F": true 
     } 
    } 
    } 
} 

私は今、私は名前財産を得ることができるので、レシピ内の成分の詳細を取得しようとしています。

ここ
func fetchRecipeIngredients() { 

    let databaseRef = FIRDatabase.database().reference().child("RecipeData/recipe/-KlApwz5Y-TK_9z1sV1i/ingredients") 

    databaseRef.observeSingleEvent(of: FIRDataEventType.value, with: { snapshot in 
     for ingredients in snapshot.children { 

      print(snapshot) 
     } 
    }) 
} 

は私Recipeクラスである:私はレシピの材料内部の繰り返し処理機能を持っている時に、まず

  1. class Recipe { 
    
        var name: String! 
        var key: String 
    
        init(from snapshot: FIRDataSnapshot) { 
    
         let snapshotValue = snapshot.value as! [String: Any] 
    
         self.name = snapshotValue["recipeName"] as! String 
         self.key = snapshot.key 
        } 
    } 
    

    を私は2つの主な問題点を持っています特定のレシピを反復する方法や、達成したいことが必要かどうかはわかりません。今のところ、内部でiterateできるようにrecipeIDをハードコードしています。ここに行く事前にこのfetchRecipeIngredients()

感謝:)

答えて

1

を使用した場合

  • はどのようにして、成分の詳細を取得します。

    あなた

    に似ていFirebase構造

    { 
        "IngredientData" : { 
        "ingredient_0" : { 
         "name" : "Onions" 
        }, 
        "ingredient_1" : { 
         "name" : "Peas" 
        }, 
        "ingredient_2" : { 
         "name" : "Mushrooms" 
        }, 
        "ingredient_3" : { 
         "name" : "Tomatoes" 
        }, 
        "ingredient_4" : { 
         "name" : "Dough" 
        } 
        }, 
        "RecipeData" : { 
        "recipe_0" : { 
         "ingredients" : { 
         "ingredient_0" : true, 
         "ingredient_1" : true, 
         "ingredient_2" : true 
         }, 
         "name" : "Fried Rice" 
        }, 
        "recipe_1" : { 
         "ingredients" : { 
         "ingredient_0" : true, 
         "ingredient_2" : true, 
         "ingredient_3" : true, 
         "ingredient_4" : true 
         }, 
         "name" : "Pizza" 
        } 
        } 
    } 
    

    で始まり、我々は特定のレシピにロードするための主な機能、そして食材をロードする機能を持っています。

    func loadRecipe() { 
         let recipiesRef = self.ref.child("RecipeData") 
         let recipieToLoadRef = recipiesRef.child("recipe_1") 
    
         recipieToLoadRef.observeSingleEvent(of: .value, with: { snapshot in 
          let recipieDict = snapshot.value as! [String:Any] 
          let name = recipieDict["name"] as! String 
          let ingredientsSnap = snapshot.childSnapshot(forPath: "ingredients") 
          print(name) 
          self.loadIngredients(ingredientSnap: ingredientsSnap) 
         }) 
        } 
    
        func loadIngredients(ingredientSnap: DataSnapshot) { 
         let ingredientsRef = self.ref.child("IngredientData") 
    
         for ingredient in ingredientSnap.children { 
          let snap = ingredient as! DataSnapshot 
          let ingredientKey = snap.key 
          let thisIngredient = ingredientsRef.child(ingredientKey) 
          thisIngredient.observeSingleEvent(of: .value, with: { snapshot in 
           let ingredientDict = snapshot.value as! [String: Any] 
           let ingredientName = ingredientDict["name"] as! String 
           print(" \(ingredientName)") 
          }) 
         } 
        } 
    } 
    

    とフォローアップのコメントに応答して出力

    Pizza 
        Onions 
        Mushrooms 
        Tomatoes 
        Dough 
    

    EDIT

    ユーザーがノードを作成し、その後、自分のお気に入りを保存したい場合は

    favorites 
        recipe_1: true 
        recipe_2: true 
    

    /favainsノードを.valueで観察します(これにより、すべてのお気に入りが一度に読み込まれます)。スナップショット内の子を反復処理します。キーはレシピノード名(recipe_1とrecipe_2)になります。次に、ノードから直接各レシピ名を読み込み(/ recipe_1/name)、tableViewのデータソースとして使用できる配列を作成します。

  • +0

    この回答をいただきありがとうございます。特定のレシピを特定することに関してただ1つの質問。現時点では、レシピの_ingredients_の詳細を取得するために、そのレシピの_ID_を「recipieToLoadRef」にハードコードする必要がありました。しかし、ユーザーがレシピを追加するためのfavouriteListを作成したいとしましょう。レシピを指定してtableViewのように表示する方法を教えてください。私はこれと同じアプローチを試みました。この質問が無関係なら、心配しないでください。もう一度ありがとう:) – Chace

    +0

    @Chace Glad it helped!私はあなたのフォローアップの質問に対処するためのいくつかの追加情報で答えを更新しました。 – Jay

    +0

    この回答に感謝します。私はこれを試みましたが、私はレシピをユーザーのお気に入りの中にプリントアウトすることができます。しかし、そこから、各レシピ名をノードから直接読み込み(/ recipe_1/name)、tableView_のデータソースとして使用できる配列を取り込むことができる部分は、どこにいるのですか:/ – Chace

    関連する問題