किसी कारण से, मैं firebase से डेटा पुनर्प्राप्त करने के बाद, डेटा सफलतापूर्वक पुनर्प्राप्त किया।

    func retrieveData(user: User) {
        //let userID = Auth.auth().currentUser?.uid
        let email = user.emailAddress!
        // print(email)
        databaseRef?.child("userTable").child(email).observe(.value, with: { (snapshot) in
            // Get user value
            print("whats up ")
            if let value = snapshot.value as? [String:String] {
                let res = value["posts"]
                user.deserialize(data: res!)
                if( user === self.u1) {
                    print("they are same obj") // this will print, so they are pointing to the same address
                }
                print(self.u1.posts) // this also printed the things I want
            }
            // ...
        })
        if( user === self.u1) {
            print("they are same obj outside") // this also prints
        }
        print(self.u1.posts) // but once they exist closure, this one just become empty, as as user.posts
    }

मैं वास्तव में समझ नहीं पा रहा हूं कि यहां क्या हो रहा है। ऐसा लगता है जैसे डेटा बंद होने के बाद ठीक से संग्रहीत किया जाता है। साथ ही, मुझे नहीं पता कि क्लोजर के बाहर का कोड पहले क्यों प्रिंट करता है। किसी भी मदद के लिए बहुत बहुत धन्यवाद!

यह चल रहा परिणाम है

वे बाहर एक ही obj हैं [:]

व्हाट्स अप वे वही obj हैं ["a@hotmail 0": RadiUs.Post]

0
Ryan Chen 21 अप्रैल 2019, 20:36

1 उत्तर

सबसे बढ़िया उत्तर

अतुल्यकालिक संचालन के कारण, आपके तीसरे प्रिंट स्टेटमेंट पर कोई मूल्य (अभी तक) नहीं है।

आपका पहला दो प्रिंट स्टेटमेंट वास्तव में आपके तीसरे प्रिंट स्टेटमेंट के बाद निष्पादित होता है, भले ही वह ऐसा न लगे। यदि आप प्रत्येक प्रिंट स्टेटमेंट पर ब्रेकप्वाइंट बनाते हैं, तो आप निष्पादन का क्रम देख पाएंगे।

तो यह गारंटी देने के लिए कि डेटा फायरबेस से वापस आ गया है, आपको केवल यहां डेटा को कॉल करना चाहिए:

databaseRef?.child("userTable").child(email).observe(.value, with: { (snapshot) in
        // Manipulate data here
        }

यदि आप कॉल को सिंक्रोनस करना पसंद करते हैं, तो आप निम्न कार्य कर सकते हैं:

    func retrieveData(user: User) {
    //let userID = Auth.auth().currentUser?.uid
    let email = user.emailAddress!
    // print(email)
    databaseRef?.child("userTable").child(email).observe(.value, with: { (snapshot) in
        // Get user value
        print("whats up ")
        if let value = snapshot.value as? [String:String] {
            let res = value["posts"]
            user.deserialize(data: res!)
            if( user === self.u1) {
                print("they are same obj") // this will print, so they are pointing to the same address
            }
            print(self.u1.posts) // this also printed the things I want
        }
        // ...
    })
    if( user === self.u1) {
        print("they are same obj outside") // this also prints
    }
    DispatchQueue.main.async{
        print(self.u1.posts) // Now called sequentially 
    }
}
0
sfung3 21 अप्रैल 2019, 19:33