2017-10-13 27 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

相關問題