【问题标题】:Nested Dispatch Groups Swift嵌套调度组 Swift
【发布时间】:2017-01-30 21:49:15
【问题描述】:

当用户在我的应用程序中创建新组时,我必须将邀请以及其他信息推送到数据库。我已经开始使用调度组来跟踪所有信息何时成功发送,以便我可以关闭视图。

我正在尝试对邀请使用一个调度组,对所有数据使用另一个调度组。这是我所拥有的:

// 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 组的新手,想知道这是否是处理此类任务的正确方法。

【问题讨论】:

    标签: swift firebase swift3 firebase-realtime-database grand-central-dispatch


    【解决方案1】:

    这是一种非常好的异步任务跟踪方法。

    检查是否所有代码路径都被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, height: Int(500*(profImage.size.height/profImage.size.width))))) {
            storageRef.put(uploadData, metadata: nil, completion: { (metadata, error) in
                dataDispatchGroup.leave()
            })
        } else {
            dataDispatchGroup.leave()
        }
        [...]
    }
    

    通常还要确保在您使用的方法的所有代码路径中调用所有完成块。 Firebase 中可能总是存在错误,或者可能在这些方法的文档中没有调用完成。但同样,这是要走的路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多