2011-04-11 23 views
25

से सभी अधिसूचना पर्यवेक्षक निकाला जा रहा है मैं एक अधिसूचना पर्यवेक्षक निकालना चाहते हैं और मैं विधि का उपयोग कर रहा हूँ:एक ही स्थान

removeObserver: name:@"myNotification" object:nil 
इस के लिए

। अब ऐसे कई पर्यवेक्षक हैं जो इस अधिसूचना को सुन रहे हैं और मैं उन सभी को एक केंद्रीकृत स्थान से एक शॉट में हटाना चाहता हूं। क्या मैं पहले पैरामीटर में 'शून्य' पास कर सकता हूं और यह उन सभी पर्यवेक्षकों को हटा देगा जो मेरे नोटिफिकेशन को सुन रहे हैं?

+1

आप इसे की कोशिश की? –

उत्तर

76

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

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

यह ऑब्जेक्ट स्तर पर है ... इसलिए यह कई अधिसूचनाओं के लिए पंजीकरण नहीं करेगा। यह कई वस्तुओं में एक अधिसूचना के लिए पंजीकरण नहीं करेगा।

आशा मैं सही ढंग से अपने प्रश्न समझ में आ।

+0

ठीक है। क्या किसी ऑब्जेक्ट से ऑब्जेक्ट को डिग्रिस्टर करने का कोई तरीका नहीं है? मैं कक्षा ए हूं और अधिसूचना से कक्षा बी वस्तु को अपमानित करना चाहता हूं। – Abhinav

+0

मुझे नहीं लगता कि यह @ अहिनाव का मतलब है। वह NSNotificationCenter प्रेषण तालिका से सभी पर्यवेक्षकों को हटाना चाहता है, किसी विशेष ऑब्जेक्ट को पर्यवेक्षक को सभी अधिसूचनाओं को रोकना नहीं है। – XJones

+0

@xjones मैं फिर से पढ़ता हूं और आप सही हैं। मैंने 'पहला पैरामीटर' अधिसूचना नाम के रूप में पढ़ा, ऑब्जेक्ट नहीं। ऐसा कहा जा रहा है कि किसी विशेष अधिसूचना के सभी पर्यवेक्षकों को हटाने का कोई तरीका नहीं है (जैसा कि ऐसा लगता है कि मैंने कुछ लोगों ने कहा है)। पंजीकरण करने वाले प्रत्येक वर्ग में बस इसे करना है। –

1

दुर्भाग्य से, वहाँ एक ही स्थान पर एक विशिष्ट अधिसूचना के सभी पर्यवेक्षकों निकालने का कोई तरीका है। निश्चित रूप से ऐसे मामलों में जहां यह अच्छा होगा हैं, यह के रूप में आम तौर पर करने के लिए एक खतरनाक बात यह है कि हो सकता है, वस्तु अवलोकन कर जोड़ने और एक विशेष सूचना के एक पर्यवेक्षक के रूप में खुद को दूर करने के लिए जिम्मेदार होना चाहिए। यह सुनिश्चित करता है कि कोई अप्रत्याशित व्यवहार बी/सी पर्यवेक्षक आ सकते हैं और जा सकते हैं ताकि वे स्वयं को कॉन्फ़िगर और साफ़ कर सकें।

एक वस्तु है कि अधिसूचना उत्पन्न हो जाती है, तो यह पर्यवेक्षक के रूप में कोई फर्क नहीं होगा पर्यवेक्षक कि वस्तु के बारे में वैसे भी नहीं जानता है। इसका मतलब यह है कि ऑब्जेक्ट और अधिसूचनाएं उत्पन्न नहीं करेगा।

[संपादित करें: अवलोकन से अपनी टिप्पणी आरई कक्षा बी रोक कक्षा एक प्रतिक्रिया]

मैं सिर्फ अपनी टिप्पणी को देखा। अलग-अलग तरीके इस वर्ग बी वर्ग ए के बारे में जानता खासकर यदि आप वर्गों संदर्भ के रूप में यह लग रहा है जैसे आप एक विशेष उदाहरण बनाम एक वर्ग के सभी उदाहरणों को प्रभावित करना चाहते हैं पूरा करने के लिए, कर रहे हैं। अगर आपके पास कुछ शर्त है तो आप अधिसूचना को संभालने के दौरान जांच सकते हैं, इस तरह मैं इस पर पहुंचूंगा। जैसे अधिसूचना हैंडलर कुछ में:

if ([self shouldRespondToNotificationNamed:notification.name]) { 
    [self performNotificationAction]; 
} 

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

7

स्विफ्ट के मामले में, आप इसे इस तरह कर रही है:

NSNotificationCenter.defaultCenter().removeObserver(self) 

और स्विफ्ट 3 में:

NotificationCenter.default.removeObserver(self) 
संबंधित मुद्दे