2015-11-23 13 views
9

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

मैं भी एक शब्दकोश का उपयोग कर इन कनेक्शन के साथ कुछ डेटा जोड़ना चाहता हूं। इसलिए मैं कोड हो सकता है:

class Connection { ... } 
class Metadata { ... } 

var metadata: [Connection: Metadata] = [:] 

लेकिन इसके बाद के संस्करण कोड का मतलब है कि शब्दकोश Connection वस्तुओं है जो मैं नहीं चाहता के लिए संदर्भ रखेंगे। Connection ऑब्जेक्ट गायब होने पर, मैं संबंधित प्रविष्टियों को हटा दिया जाना चाहूंगा, आदर्श रूप से स्वचालित रूप से।

तो मैं करने की कोशिश की:

var metadata: [weak Connection: Metadata] = [:] 

लेकिन यह काम नहीं करता। इसका एक अच्छा वैकल्पिक समाधान क्या है?

उत्तर

13

आप एक एनएसएमएपीटेबल का वर्णन कर रहे हैं। यह आपको अपनी कुंजी और/या मानों के कमजोर संदर्भों के साथ एक शब्दकोश जैसी चीज देता है।

+3

अच्छा लेख यहां: http://nshipster.com/nshashtable-and-nsmaptable/ – matt

+1

सर्वर पर स्विफ्ट लिखने वाले सभी को बस एक नोट: 'एनएसएमएपीटेबल' और 'एनएसएचशटेबल' लिनक्स पर मौजूद नहीं है, तो आप रॉब के जवाब जैसे दृष्टिकोण का उपयोग करने की आवश्यकता है। – Zoyt

2

आप How do I declare an array of weak references in Swift? में कमजोर संदर्भों के लिए एक सामान्य प्रकार लिख सकते हैं क्योंकि आप इसे कुंजीपटल कुंजी के लिए कर रहे हैं, आपको इसे Hashable के अनुरूप बनाने के लिए कुछ अतिरिक्त काम करना होगा, लेकिन यह किया जा सकता है।

व्यक्तिगत रूप से, हालांकि, मैं कनेक्शन ऑब्जेक्ट्स को कुंजी के रूप में उपयोग नहीं करता। मैं नेटवर्क अनुरोध के लिए एक अद्वितीय स्ट्रिंग पहचानकर्ता का उपयोग करता हूं (उदाहरण के लिए, NSURLSessionTask का taskIdentifier)।

जो अनुरोध के मजबूत संदर्भ को बनाए रखने वाले संग्रह की चिंता का समाधान करता है।

कार्य पूरा होने पर आइटम को हटाने के संबंध में, मैं केवल कार्य पूर्णता तर्क का यह साफ़-साफ़ हिस्सा बना देता हूं।

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