उत्तर

15

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

प्रदर्शन और स्मृति उपयोग के लिए, वे दोनों तेज़ और नगण्य स्मृति का उपयोग करते हैं। NSNotificationQueue अधिसूचनाओं के बाढ़ को रोकने के लिए coalescing है। जहां तक ​​मुझे पता है, केवीओ के पास कोई सहकारी नहीं है, जिसने मेरे लिए प्रदर्शन बिंदुओं को एक बिंदु पर बनाया है। मैं सैकड़ों ऑब्जेक्ट देख रहा था, और जब उन वस्तुओं के लिए बैच अपडेट हुआ तो मुझे सैकड़ों केवीओ कॉलबैक मिलेंगे। यह केवीओ के साथ ही एक प्रदर्शन मुद्दा नहीं था, लेकिन बैच अपडेट के परिणामस्वरूप मेरे अपने कोड के साथ चल रहा था।

प्रदर्शन वास्तव में समस्या नहीं है, यह समस्या के लिए सबसे अच्छा फिट है। यदि यह एक संपत्ति परिवर्तन है, तो केवीओ का उपयोग करें। यदि यह कोई संपत्ति परिवर्तन नहीं है, तो इस पर निर्भर करता है कि आपको एक पर्यवेक्षक या एकाधिक पर्यवेक्षकों की आवश्यकता है या नहीं।

+1

आह। अधिसूचनाओं के एकत्रीकरण के बारे में नहीं पता था। यह मेरे लिए एक काफी महत्वपूर्ण बात है। – David

+2

नोटिफिकेशन का सबसे अच्छा उपयोग किया जाता है जहां किसी ऑब्जेक्ट को किसी विशिष्ट अन्य ऑब्जेक्ट के बारे में जानने की आवश्यकता नहीं होती है। उदाहरण के लिए, आप विचारों का एक गुच्छा ताज़ा करने के लिए करता है, तो अपने अनुप्रयोग में और सूचनाओं के साथ कुछ सेटिंग में बदलाव होने वाले दृश्यों के उद्देश्य यह है कि सेटिंग का प्रबंधन करता है, जो MVC को बरकरार रखता है के किसी भी ज्ञान है की जरूरत नहीं है चाहते हो सकता है। –

0

एक बहुत पुराना सवाल है, लेकिन कुछ बिंदु जोड़ने का विचार किया। मैं Tom Dalling's answer से सहमत हूं, हालांकि, बड़े अनुप्रयोगों में कई परिदृश्य हैं जहां हम ऑब्जेक्ट की संपत्ति के लिए पर्यवेक्षक जोड़ते हैं और हम नहीं कर सकते हैं, या हम पर्यवेक्षकों की सूची से उन्हें हटाने में चूक जाते हैं।

हमें अपने आवेदन से इस परिदृश्य पर विचार करें - एक ViewController एक साँप वस्तु को प्रदर्शित करता है, मैं इस वस्तु पर एक संपत्ति बदलाव के लिए देख रहा हूँ - "जहर"। तो जब भी एक अलग सांप दिखाने के लिए नियंत्रक को देखने की आवश्यकता होती है तो मैं उस सांप ऑब्जेक्ट के पर्यवेक्षक से दृश्य नियंत्रक को हटा दूंगा।

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

ऊपर उद्धृत करने के लिए केवल एक उदाहरण है, मुख्य समस्या यहाँ है मैं उन्हें पर्यवेक्षकों से दूर करने के लिए किसी दिए गए ऑब्जेक्ट के लिए KVO पर्यवेक्षकों की सूची प्राप्त नहीं कर सकता से पहले इस वस्तु जारी किया जाता है - यह आसानी से NSNotification और प्राप्त किया जा सकता NSNotificationCenter। समय में, मैं KVO से अधिक NSNotification का उपयोग कर की ओर झुका हो जाते हैं, फिर भी, KVO हमेशा अच्छा डिजाइन अभ्यास के संदर्भ में अधिसूचना से अधिक बढ़त है।

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