मैं NSUserDefaults में संग्रहीत सूची से किसी तत्व को निकालने का प्रयास कर रहा हूं। GetAll फ़ंक्शन नीचे कार्यान्वित किया गया है:

  func getAllOrders() -> [Order] {

        var orders = [Order]()

        if let userDefaults = UserDefaults(suiteName: "group.com.johndoe.SoupChef.Shared") {

            if let ordersData = userDefaults.data(forKey: "Orders") {
                orders = try! JSONDecoder().decode([Order].self, from: ordersData)
            }
        }

        return orders
    }

और यहाँ आदेश को हटाने के लिए कोड है।

func delete(order :Order) {

        var persistedOrders = getAllOrders()

        persistedOrders.removeAll { persistedOrder in
            persistedOrder.identifier.uuidString == order.identifier.uuidString
        }

    }

उपरोक्त कोड में ऑर्डर को हटाने के बाद जब मैं getAllOrders को कॉल करता हूं तो मुझे अभी भी सभी तत्व दिखाई देते हैं, जिसका अर्थ है कि मुझे ऑर्डर हटाया जा रहा है।

0
john doe 10 जुलाई 2018, 19:07
समाधान के साथ इसे अद्यतन करने के लिए अपने प्रश्न को संपादित न करें। या तो उचित होने पर किसी एक उत्तर को स्वीकार करें या पूर्ण समाधान के साथ अपना उत्तर पोस्ट करें।
 – 
rmaddy
10 जुलाई 2018, 19:33
FYI करें - अपने ऐप डेटा को UserDefaults में स्टोर न करें।
 – 
rmaddy
10 जुलाई 2018, 19:34

3 जवाब

ऐसा इसलिए है क्योंकि आप अपने परिवर्तन सहेजते नहीं हैं। एक बार जब आप निष्कासन कर लेते हैं तो आपको persistedOrders को वापस JSON में बदलना होगा और फिर:

userDefaults.set(json, forKey:"Orders")
1
rmaddy 10 जुलाई 2018, 19:34
धन्यवाद! मैं इस धारणा के तहत था कि चूंकि मैं उसी ऑर्डर सूची से हटा रहा हूं, यह स्वचालित रूप से सहेजे गए संग्रह को अपडेट कर देगा (संदर्भ द्वारा)
 – 
john doe
10 जुलाई 2018, 19:14
उसे इसे फिर से डेटा में बदलने की जरूरत है न कि json
 – 
Sh_Khan
10 जुलाई 2018, 19:19
धन्यवाद! मैंने समाधान के साथ मूल प्रश्न अपडेट किया।
 – 
john doe
10 जुलाई 2018, 19:20
3
मुझे लगता है कि synchronize अब Apple द्वारा अनावश्यक के रूप में चिह्नित किया गया है: developer.apple .com/documentation/foundation/userdefaults/…
 – 
Samantha
10 जुलाई 2018, 19:21
आपको पकड़ने की कोशिश करनी चाहिए कोशिश न करें! क्योंकि इससे दुर्घटना हो सकती है
 – 
Sh_Khan
10 जुलाई 2018, 19:21

आपको jsonEncoder का उपयोग करने और संपादित सरणी को एन्कोड करने की आवश्यकता है, फिर इसे फिर से स्टोर करें उपयोगकर्ता डिफ़ॉल्ट

func delete(order :Order) {

    var persistedOrders = getAllOrders()

    persistedOrders.removeAll { persistedOrder in
        persistedOrder.identifier.uuidString == order.identifier.uuidString
    }
    do {

        let data = try JSONEncoder().encode(persistedOrders)
        userDefaults.set(data, forKey:"Orders")
    }
    catch {

        print(error)
    }

}
0
Sh_Khan 10 जुलाई 2018, 19:18

आपको अपने UserDefaults को सही ढंग से स्टोर करना होगा

UserDefaults.standard.set(json, forKey:"Orders")

अब, आप उनका उपयोग करके उन्हें हटा सकते हैं:

UserDefaults.standard.removeObject(forKey: "Orders")
0
Benjamin RD 10 जुलाई 2018, 19:37