嵌套调度组Swift
发布时间:2020-12-14 02:24:10 所属栏目:百科 来源:网络整理
导读:当用户在我的应用程序中创建新组时,我必须将邀请推送到数据库以及其他信息.我已经开始使用Dispatch Groups来跟踪成功发送所有信息的时间,因此我可以解除该视图. 我正在尝试为邀请使用调度组,为所有数据使用另一个调度组.这就是我所拥有的: // Push new data
当用户在我的应用程序中创建新组时,我必须将邀请推送到数据库以及其他信息.我已经开始使用Dispatch Groups来跟踪成功发送所有信息的时间,因此我可以解除该视图.
我正在尝试为邀请使用调度组,为所有数据使用另一个调度组.这就是我所拥有的: // Push new data to db func 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中可能存在一个错误,或者可能在这些方法的文档中没有调用完成.但同样,这是要走的路. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |