2017-10-13 7 views
0

完了したらオブジェクトを保存し、autoIdの子を同じオブジェクトに追加する必要があります。私は現在、最初のオブジェクトを保存していて、ループ内でautoIdの子を追加しています。これを行うより効果的な方法があるかどうか疑問に思っていましたか?firebase childByAutoId()を使用して複数の子を保存する方法

let data: [String: Any] = [ 
    "one": 1, 
    "two": 2, 
    "aboutS": "yeeah", 
    ] 

//Data to be saved with auto id after inital data saved 
let mediaMetaData: [[String: Any]] = [ 
    ["path": "nda.mov", "type": "009"], 
    ["path": "nda.mov", "type": "009"] 
] 

ref.getUserSkillDatabasePath(authUser).childByAutoId().setValue(data, withCompletionBlock: { 
    error, dbReference in 
    if error != nil { 
    print(error as Any) 
    } 
    let mediaUploadGroup = DispatchGroup() 

    //Loop through mediaMetaData and save children using auto id 
    // Wish to save all children with auto id objects at once? 
    mediaMetaData.forEach { 
    meta in 
    mediaUploadGroup.enter() 
    dbReference.child("media").childByAutoId().setValue(meta, withCompletionBlock: {_,_ in 
     mediaUploadGroup.leave() 
    }) 
    } 
    mediaUploadGroup.notify(queue: .main, execute: { 
    completion(error) 
    }) 
}) 

答えて

2

あなたはアトミック書き込みのためupdateChildValuesを使用して試みることができます。このようにすると、同じ結果が得られます。

let data: [String: Any] = [ 
    "one": 1, 
    "two": 2, 
    "aboutS": "yeeah", 
    ] 

let mediaMetaData: [[String: Any]] = [ 
    ["path": "nda.mov", "type": "009"], 
    ["path": "nda.mov", "type": "009"] 
] 

let userRef = ref.getUserSkillDatabasePath(authUser) 
let userKey = userRef.childByAutoId().key 

var dataObject: [String: Any] = data 
for meta in mediaMetaData { 
    let mediaKey = userRef.child(userKey).child("media").childByAutoId().key 
    dataObject["/media/\(mediaKey)"] = meta 
} 

userRef.child(userKey).updateChildValues(dataObject, withCompletionBlock: { _,_ in 
    print("Success") 
}) 
+0

もっと良い解決策です。ご協力いただきありがとうございます – kye