加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

嵌套调度组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中可能存在一个错误,或者可能在这些方法的文档中没有调用完成.但同样,这是要走的路.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读