2012-05-17 13 views
19

dealloc: में viewDidLoad: और removeObserver में addObserver का उपयोग किया गया था। कोड:NSNotificationCenter के साथ ऑब्सर्वर/निकालें ऑब्सर्वर जोड़ने का बेहतर तरीका क्या है?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(refreshData) 
               name:AnyNotification 
               object:nil]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:AnyNotification 
                object:nil]; 
} 

लेकिन कुछ लेख के अनुसार ने कहा, यह viewDidDisappear: में viewDidAppear: और removeObserver में addObserver बेहतर है। कोड:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(refreshData) 
               name:AnyNotification 
               object:nil]; 
} 

- (void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:AnyNotification 
                object:nil]; 
} 

तो, ऑब्सर्वर/निकालें ऑब्सर्वर जोड़ने का बेहतर तरीका क्या है?

+0

संभव स्मृति चेतावनी के मामले में 'dealloc' में पर्यवेक्षक को निकालना अच्छा नहीं है। – Eimantas

+1

दृश्य गायब हो गया था, बस सुनिश्चित करें कि आप प्रत्येक विशिष्ट अधिसूचना के लिए पर्यवेक्षक को हटा दें और हटाएं ऑब्सर्वर: स्वयं या अन्यथा जब दृश्य फिर से दिखाई देता है तो आप सुपर क्लास अधिसूचना पर्यवेक्षकों को हटा देते हैं। – chourobin

उत्तर

19

यह आपके परिदृश्य पर निर्भर करता है, आम तौर पर सबसे अच्छा तरीका viewDidLoad में जोड़ सकते हैं और dealloc में और viewDidUnload में दूर करने के लिए है, लेकिन आप यूआई प्रभाव की तरह अलग अलग वर्गों में एक ही विधि है और केवल वर्तमान स्क्रीन के कॉल करना चाहते हैं जब कुछ मामलों देखते हैं सूचना का उपयोग विधि है, तो आप क्योंकि हर मामले में मैं भर में आया था viewWillAppear में पर्यवेक्षक जोड़ सकते हैं और viewWillDisappear या viewDidAppear/viewDidDisappear

+6

मुझे लगता है कि पहला समाधान सबसे अच्छा नहीं है क्योंकि कक्षा में प्रवेश होने पर स्थितियां हो सकती हैं लेकिन दृश्य लोड नहीं किया गया था। ऐप त्रुटि के साथ दुर्घटनाग्रस्त हो जाएगा " से कुंजी पथ" KEY_PATH "के लिए एक पर्यवेक्षक को हटा नहीं सकता क्योंकि यह पर्यवेक्षक के रूप में पंजीकृत नहीं है।" – DanSkeel

+2

@DanSkeel शायद 'init' और' awakeFormNib' में जोड़ सकता है? – Puttin

+0

'viewWillLoad'' के बजाय 'viewDidLoad' में जोड़ने के लिए सबसे अच्छा क्यों है? मुझे लाभ नहीं दिख रहा है। मैं पर्यवेक्षक को केवल आवश्यकता के दौरान ही रखना पसंद करता हूं, इसलिए मैं 'व्यूविल्लएपियर' और 'व्यूविल डिस्प्लेयर' का उपयोग करता हूं। साथ ही, उन कॉलों को विश्वसनीय रूप से जोड़ा जाता है। – ToolmakerSteve

3

में इसे हटाने मैं सामान्य रूप से -viewDidAppear: और -viewDidDisapear: (या -viewWillAppear: और -viewWillDisappear:) में डाल दिया जाएगा करने के लिए बस होगा मैं केवल अधिसूचना में रूचि रखता हूं अगर vi ईडब्ल्यू वास्तव में प्रदर्शित किया जाता है।

यह शायद एक समयपूर्व अनुकूलन है (अधिसूचना को संभालने के लिए आपका कोड कुछ समय ले सकता है, लेकिन दृश्य प्रदर्शित नहीं होने पर बेकार हो सकता है), लेकिन फिर यह भी कोई कोड नहीं है - यह एक अलग विधि में एक ही कोड है ...

1

NSKeyValueObservingOptionInitial को मत भूलना। मैं इसे viewWillAppear/viewWillDisappear के साथ उपयोग करता हूं, इसलिए मेरा यूआई हमेशा अद्यतित है, भले ही मैं उस व्यू कंट्रोलर को छुपाता हूं, संसाधनों को सहेजता हूं क्योंकि मैं इसे फिर से दिखाए जाने तक अपडेट नहीं करूँगा।

0

-viewWillAppear: + -viewWillDisappear:-viewDidAppear: + -viewDidDisapear: से बेहतर है, क्योंकि उन्हें हमेशा एक ही बार कहा जाता है।

+0

@ टूलमेकरस्टेव, वे जोड़े गए हैं। – 0xa6a

+0

@ToolmakerSteve, जब नेविगेशन नियंत्रक का 'इंटरैक्टिव पॉप गैजोरर रिकॉग्नाइज़र' सक्षम है। – 0xa6a

+0

ठीक है, मैं समझता हूं कि अब आप क्या कह रहे हैं। मैंने इसे स्पष्ट करने के लिए अपना शब्द संपादित कर लिया है, और आपको उकसाया है, क्योंकि मेरा मानना ​​है कि आप एक महत्वपूर्ण बिंदु बना रहे हैं। [हालांकि मैं वर्तमान में एक ऐप विकसित नहीं कर रहा हूं, इसलिए मैं पुष्टि नहीं कर सकता कि 'डीडी' फ़ंक्शंस हमेशा संतुलित नहीं होते हैं।] (किसी और ने आपको कम किया होगा, शायद उसी कारण से मैं उलझन में था - बता नहीं सका आप क्या कह रहे थे।) – ToolmakerSteve

0

सबसे अच्छा तरीका NSNotifications का उपयोग कर जब आप सूचनाएं के लिए निरीक्षण करने की आवश्यकता और उन्हें हटाने जब आप उन्हें अब और की जरूरत नहीं है पर्यवेक्षक जोड़ने है।

इस पर हो सकता है viewDidLoad:, viewWillAppear:, या उपयोगकर्ता कुछ बटन टैप करता जब आदि

मैं तुम्हें एक छोटे से उदाहरण दे देंगे:

मेरा ऐप एक tabbar है, और दृश्य नियंत्रकों में से कुछ में , मैं इंटरनेट से डाउनलोड की गई कुछ जानकारी प्रदर्शित कर रहा हूं (उदाहरण के लिए एक ट्वीट)। मेरे पास प्रत्येक 2 मिनट में सर्वर से नए डेटा के लिए कक्षा पूलिंग भी है, और सर्वर के पास नया डेटा था, इसलिए मैंने डेटाबेस पर जानकारी अपडेट की। मैं डीबी परिवर्तनों को सुनने के लिए एक प्रतिनिधि पैटर्न का उपयोग नहीं करूंगा, क्योंकि मेरे पास डेटा प्रदर्शित करने वाले बहुत से दृश्य नियंत्रक हैं, और यह एक बहुत ही खराब डिज़ाइन होगा जो प्रतिनिधि को प्रत्येक दृश्य नियंत्रक के लिए डेटा पास करने के लिए एक सरणी और लूपिंग कर देगा। इसलिए, इस विशिष्ट परिदृश्य में, सबसे अच्छा करने के लिए प्रत्येक वीसी को बताते हुए अधिसूचना पोस्ट करना है कि नया डेटा आ गया है।

यदि दृश्य गायब होने पर आपका वीसी प्रतिनिधि को हटा देता है, तो केवल वर्तमान में अधिसूचना प्राप्त होगी और प्रदर्शित सामग्री अपडेट होगी।

उदाहरण के लिए आप viewWillAppear: पर प्रदर्शन से पहले अन्य वीसी की सामग्री को अपडेट कर सकते हैं, लेकिन ऐसा करने से वीसी सामग्री न केवल आवश्यक होने पर अपडेट की जाएगी, लेकिन हर बार जब आप टैब बदलते हैं।

यह केवल एक उदाहरण था, जहां मैंने आपको यह दिखाने की कोशिश की कि एनएसएनोटिफिकेशन के लिए, आपको सलाह देना मुश्किल है कि जब पर्यवेक्षकों को जोड़ना या निकालना है, तो हमारे पास ऐप व्यवहार के बारे में संपूर्ण विवरण नहीं है।

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