我正在尝试为邀请使用调度组,为所有数据使用另一个调度组.这就是我所拥有的:
// Push new data to dbfunc createGroup(onSccess completion:@escaPing () -> VoID) { let invitedispatchGroup = dispatchGroup() let datadispatchGroup = dispatchGroup() let uID = FIRAuth.auth()?.currentUser?.uID let name = String(uID!) + "_" + nameTextFIEld.text! // push invites datadispatchGroup.enter() for invite in invites { invitedispatchGroup.enter() let ref = FIRDatabase.database().reference().child("users").child(invite.ID).child("invites") ref.updateChildValues([name: nameTextFIEld.text!]) { (error,ref) -> VoID in invitedispatchGroup.leave() } } invitedispatchGroup.notify(queue: dispatchQueue.main,execute: { datadispatchGroup.leave() }) // store picture datadispatchGroup.enter() let storageRef = Firstorage.storage().reference().child("profile_images").child("\(name).png") if let uploadData = UIImagePNGRepresentation(profImage.resizeImage(targetSize: CGSize(wIDth: 500,height: Int(500*(profImage.size.height/profImage.size.wIDth))))) { storageRef.put(uploadData,Metadata: nil,completion: { (Metadata,error) in datadispatchGroup.leave() }) } // store pet info datadispatchGroup.enter() let petRef = FIRDatabase.database().reference().child("pets").child(name) petRef.setValue(["mod":uID!,"name":nameTextFIEld.text!,"members":[uID!]]) { (error,ref) -> VoID in datadispatchGroup.leave() } // store user info datadispatchGroup.enter() let userRef = FIRDatabase.database().reference().child("users").child(uID!).child("pets") userRef.updateChildValues([name: true]) { (error,ref) -> VoID in datadispatchGroup.leave() } datadispatchGroup.notify(queue: dispatchQueue.main,execute: { completion() })}
如您所见,当invitesDipatchGroup完成时,它将保留相应的datadispatchGroup.
我是dispatch小组的新手,想听听这是否是采取这种任务的正确方法.
这是异步任务跟踪的一种非常好的方法.检查所有代码路径是否都包含leave()非常重要.你有一个潜在的错误,如果if let没有值不是可选的.修正了这里:
func createGroup(onSccess completion:@escaPing () -> VoID) { [...] // store picture datadispatchGroup.enter() let storageRef = Firstorage.storage().reference().child("profile_images").child("\(name).png") if let uploadData = UIImagePNGRepresentation(profImage.resizeImage(targetSize: CGSize(wIDth: 500,error) in datadispatchGroup.leave() }) } else { datadispatchGroup.leave() } [...]}
通常,还要确保在所使用的方法的所有代码路径中调用所有完成块. Firebase中可能存在一个错误,或者可能在这些方法的文档中没有调用完成.但同样,这是要走的路.
总结以上是内存溢出为你收集整理的嵌套调度组Swift全部内容,希望文章能够帮你解决嵌套调度组Swift所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)