2009-01-24 3 views
8

मेरे पास FileReference ऑब्जेक्ट्स की एक सरणी है जिसमें उनमें से प्रत्येक से जुड़े कई श्रोताओं हैं, क्या मुझे प्रत्येक श्रोता को हैंडलर विधि में हटा देना चाहिए, या क्या मुझे उन्हें पूरे हैंडलर में हटा देना चाहिए?फ्लेक्स/एएस 3: श्रोताओं को कब हटाया जाए?

मैंने कहीं पढ़ा है श्रोताओं के लिए कमजोर संदर्भ का उपयोग करने के लिए, लेकिन मैं इसे बेहतर होगा स्पष्ट रूप से श्रोताओं को दूर करने लगता होगा (हाँ?/नहीं?)

for each(var f:Object in fileCollection){ 
    var myFile:FileReference = f.file; 
    myFile.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData) 
    myFile.addEventListener(ProgressEvent.PROGRESS, onProgress); 
    myFile.addEventListener(IOErrorEvent.IO_ERROR, onError); 
    myFile.addEventListener(Event.COMPLETE, onComplete); 
} 

private function onUploadCompleteData(e:DataEvent):void{ 
    // doin my thing here 
    removeListeners(e) 
} 

private function removeListeners(e:Event):void{ 
    var myFile:FileReference = FileReference(e.target) 
    myFile.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData) 
    myFile.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
    myFile.removeEventListener(IOErrorEvent.IO_ERROR, onError); 
    myFile.removeEventListener(Event.COMPLETE, onComplete); 
} 

उत्तर

9

यह हमेशा स्पष्ट रूप से अपने श्रोताओं को दूर करने के लिए एक अच्छा विचार है जब आपको अब उनकी आवश्यकता नहीं है, हाँ, और जिस तरह से आप इसे कर रहे हैं वह ठीक है। यह थोड़ा वर्बोज़ प्रतीत हो सकता है, लेकिन यह अभी भी अच्छा अभ्यास है, और यह आपको यह जानने की आदत में रखता है कि आपके श्रोताओं कहां हैं, क्योंकि अक्सर लीक और अप्रत्याशित व्यवहार की ओर जाता है।

उपयोग के लिए WeakReference, मैं अनियंत्रित श्रोताओं को हटाने के अलावा लगभग हमेशा इसका उपयोग करता हूं। मेरे लिए, यह अपवाद के बजाय नियम बन गया है। यदि आपको एक चुनना है, हालांकि, अपने श्रोताओं को स्पष्ट रूप से हटा दें। व्यक्तिगत रूप से, हालांकि, मैं दोनों करता हूं।

असल में, मुझे ऐसे अवसरों की संख्या मिली है जिनमें उपयोग छोड़ने के लिए सबसे अच्छा होगा, वीक रेफरेंस झूठी, क्योंकि ऐसा करने से ऑब्जेक्ट्स को कचरा होने से रोक दिया जाएगा, विशेष रूप से दुर्लभ है। दरअसल, इससे पहले कि मैंने सीखा कि यह तर्क (blog post here) के लिए क्या था, मैंने फ्लेक्स फ्रेमवर्क से घटने वाले रनटाइम अपवादों के बाद मेरे सिर को खरोंचने में एक टन बिताया, मुझे यकीन था कि मैं डिस्प्ले सूची से हटा दूंगा।

दीपा सुब्रमण्यम ने पिछले वर्ष के MAX सम्मेलन (एक उत्कृष्ट बात अच्छी तरह से जांचने योग्य) में her component-model talk में इसका उल्लेख किया है; मेरा मानना ​​है कि जिस तरह से उसने इसे रखा था, वह कुछ ऐसा था, "मुझे नहीं पता कि फ्लैश प्लेयर टीम ने सच के बजाय डिफ़ॉल्ट गलत क्यों चुना है, लेकिन 99% समय, आप उस मान को सेट करना चाहते हैं सच।"

+0

आपका ब्लॉग पोस्ट सहायक था, धन्यवाद मैक्स टॉक भी, धन्यवाद। – Ronn

2

यदि आप किसी प्रदर्शन ऑब्जेक्ट में ऑब्जेक्ट्स जोड़ रहे हैं, तो मैं श्रोताओं को हटाने की सलाह दूंगा जब Event.REMOVED_FROM_STAGE ईवेंट निकाल दिया जाता है, और जब इसे चरण में जोड़ा जाता है तो उन्हें जोड़ना। यह सुनिश्चित करने का एक आसान तरीका है कि श्रोताओं को आपके द्वारा लिखे गए हटाए गए लिस्टेनर्स फ़ंक्शन को स्पष्ट रूप से कॉल करने के साथ हटा दिया गया हो। उदाहरण के लिए, आपके कोड सेगमेंट में, यदि लोड विफल रहता है तो श्रोताओं को कभी नहीं हटाया जाएगा।