5

जब कोई उपयोगकर्ता मेरे ऐप में एक नया समूह बनाता है तो मुझे डेटाबेस के साथ-साथ अन्य जानकारी को आमंत्रित करना होगा। जब सभी जानकारी सफलतापूर्वक भेजी जाती है तो ट्रैक रखने के लिए मैंने डिस्पैच समूह का उपयोग शुरू कर दिया है ताकि मैं दृश्य को खारिज कर सकूं।नेस्टेड डिस्पैच समूह स्विफ्ट

मैं आमंत्रण के लिए एक प्रेषण समूह और सभी डेटा के लिए एक अन्य प्रेषण समूह का उपयोग करने की कोशिश कर रहा हूं। यहाँ मैं क्या है:

// 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 इसी रहा है छोड़ दिया है।

मैं डिस्पैच समूहों के लिए नया हूं और यह सुनना चाहता हूं कि यह इस तरह के कार्य के साथ लेने का सही तरीका है या नहीं।

उत्तर

3

यह एसिंक कार्य ट्रैकिंग के लिए एक बहुत अच्छा तरीका है।

यह जांचना महत्वपूर्ण है कि सभी कोड पथ 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() 
    } 
    [...] 
} 

सामान्य में हमेशा भी सुनिश्चित करें कि सभी पूरा होने के ब्लॉक विधि का उपयोग का कोड रास्तों में से सभी में कहा जाता है बनाते हैं। फायरबेस में हमेशा एक बग हो सकता है या उन तरीकों के दस्तावेज में पूरा नहीं होने के बारे में कुछ हो सकता है। लेकिन फिर, यह जाने का रास्ता है।

संबंधित मुद्दे