मैं घटनाओं का प्रतिनिधित्व करने वाले जेसन डेटा की एक फ़ीड पार्स कर रहा हूं। जिस दिन ईवेंट होते हैं, उस दिन जेसन फ़ीड डिक्शनरी का डिक्शनरी होगा, और कुछ इस तरह दिखता है:

{
    "19374176" : 
    {
        "event_title" : "Cool Fun Thing to Do",
        "event_description" : "Have fun and do something cool",
        "event_start_time" : "13:00:00",
        "event_end_time" : "14:00:00"
    },
    "90485761634" :
    {
        "event_title" : "Nap Time",
        "event_description" : "Lay down and go to sleep.",
        "event_start_time" : "15:00:00",
        "event_end_time" : "16:00:00"
    }
}

मेरे पास एक संरचना स्थापित है और मैं इस जानकारी को डीकोड और उपयोग कर सकता हूं जिस तरह से मैं वर्तमान में इस कोड के साथ चाहता हूं जो एक बड़े फ़ंक्शन का हिस्सा है:

URLSession.shared.dataTask(with: url){(data, response, error) in
        if error != nil {
            print("session error: ", error!.localizedDescription)
        }

        guard let data = data else { return }

        do {
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            print(data)
            var eventData = try decoder.decode([String:Event].self, from: data)

            DispatchQueue.main.async{
                self.events = Array(eventData.values).sorted(by: {$0.timeStart < $1.timeStart
                })

                self.updateView()
                self.refreshControl.endRefreshing()
                self.activityIndicatorView.stopAnimating()
            }
        } catch DecodingError.typeMismatch(let type, let context){
            //No Dictionary of Events in Data
            print("key:", type, "context: ", context)
        } catch let jsonError{
            print("json error: ", jsonError)
        }
    }.resume()
}

मेरा मुद्दा अभी यह है कि, जिन दिनों कोई घटना नहीं होती है, जेसन फ़ीड एक खाली ऐरे है:

[]

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

मैंने इवेंटडेटा वैरिएबल असाइन करने के लिए नेस्टेड ट्राई ब्लॉक करने की कोशिश की (पहले यह देखने के लिए कि क्या यह एक [स्ट्रिंग] ((खाली सरणी, कोई ईवेंट नहीं) है) और फिर [स्ट्रिंग: कोई भी] ((घटनाओं के मूल्यों के साथ सरणी))) , लेकिन इसने मुझे URLSession के लिए एक त्रुटि दी।

क्या यह देखने के लिए कोई बेहतर तरीका है कि क्या जेसन एक खाली सरणी बनाम मेरे ईवेंट मानों का आबादी वाला शब्दकोश है और विचारों को अपडेट करें?

1
Case Silva 16 मई 2019, 17:18

1 उत्तर

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

उन्हें किसी भी ब्लॉक के बाहर ताज़ा करने का प्रयास करें

do { 
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    print(data)
    var eventData = try decoder.decode([String:Event].self, from: data)
    self.events = Array(eventData.values).sorted(by: {$0.timeStart < $1.timeStart

} catch DecodingError.typeMismatch(let type, let context){
    //No Dictionary of Events in Data
    print("key:", type, "context: ", context)
} catch let jsonError{
    print("json error: ", jsonError)
}

DispatchQueue.main.async{
    self.updateView()
    self.refreshControl.endRefreshing()
    self.activityIndicatorView.stopAnimating()
}
3
Sh_Khan 16 मई 2019, 14:24