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

यदि आपके पास उस वस्तु को संग्रहीत करने का कोई अन्य विचार है, तो मुझे इसे पढ़ना अच्छा लगेगा।

var count = Int()
var name = Array<String>()
var imageUrl = Array<String>()
var id = Array<String>()
var rating = Array<Double>()
var url = Array<String>()
var keys = 0
db.collection("parties").document(Utilities.code).addSnapshotListener { document, error in
    //check for error
    if error == nil {
        //check if document exists
        print("No error")
        if document != nil && document!.exists {
            print("Document Exists")
            if let array = document!.get("yesName") as? Array<String> {
                count = array.count
                name = array
                print("yesName = \(array)")
                keys += 1
            }
            if let array = document!.get("yesImg") as? Array<String> {
                imageUrl = array
                print("yesImg = \(array)")
                keys += 1
            }
            if let array = document!.get("yesId") as? Array<String> {
                id = array
                print("yesId = \(array)")
                keys += 1
            }
            if let array = document!.get("yesRating") as? Array<Double> {
                rating = array
                print("yesRating = \(array)")
                keys += 1
            }
            if let array = document!.get("yesUrl") as? Array<String> {
                url = array
                print("yesUrl = \(array)")
                keys += 1
            }
        }
    }else {
        print("error = \(error!)")
    }
}
while keys < 6 {
    if name.count > 0 && imageUrl.count > 0 && id.count > 0 && rating.count > 0 && url.count > 0 {
        for _ in 0...count {
            yes.list.append(RestaurantListViewModel(name: name.first!, imageUrl: URL(string: imageUrl.first!)!, id: id.first!, rating: rating.first!, url: url.first!))
            print("combined = \(yes.list.append(RestaurantListViewModel(name: name.first!, imageUrl: URL(string: imageUrl.first!)!, id: id.first!, rating: rating.first!, url: url.first!)))")
            name.removeFirst()
            imageUrl.removeFirst()
            id.removeFirst()
            rating.removeFirst()
            url.removeFirst()
        }
        keys = 6
    }
}
0
Mcrich 4 सितंबर 2021, 00:04

2 जवाब

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

स्नैपशॉट श्रोता अतुल्यकालिक रूप से निष्पादित होगा जिसका अर्थ है कि वर्तमान विधि समाप्त होने के कुछ समय बाद। तो इसे कॉल करने के बाद कोड केवल एक बार और श्रोता निर्माण के बाद निष्पादित किया जाता है: सरणी और कुंजियों में अभी तक कुछ भी नहीं है == 0। हो सकता है कि यह कोड दस्तावेज़ पढ़ने और सरणी अद्यतन होने के बाद श्रोता कॉल के अंदर होना चाहिए।

1
Ptit Xav 4 सितंबर 2021, 07:14

क्या आपने while keys < 6 { मंडली को डीबग करने का प्रयास किया है?

अगली पंक्ति की स्थिति

if name.count > 0 && imageUrl.count > 0 && id.count > 0 && rating.count > 0 && url.count > 0

आसानी से false के बराबर हो सकता है और आपको अनंत चक्र चलता है।

इसके अलावा, मुझे आपके कोड में कुछ तर्क समस्याएं दिखाई देती हैं: कोड के पहले भाग में आपने आवश्यक फ़ील्ड सेट किए हैं (keys 0 से 6 की सीमा में बराबर है)। लेकिन सर्कल के अंदर दूसरे भाग में while keys < 6 आपको सभी 6 फ़ील्ड की आवश्यकता है और सभी मानों के count > 0 होने के बाद ही बाहर निकलना चाहते हैं। आपको आवश्यकता पड़ने पर ही value.count प्राप्त करने की आवश्यकता है।

0
Buxlan 3 सितंबर 2021, 21:44