2011-06-19 18 views
7

एक सादे वर्ग में मेरे पास एक एनएसएमयूटेबलसेट संपत्ति है। जब भी सेट से वस्तुओं को जोड़ा या हटा दिया जाता है, तो मैं कुछ कस्टम कोड करना चाहता हूं। मुझे पता है कि मैं कक्षा में कुछ addObjectToSet:-जैसी विधियों को लिख सकता हूं, लेकिन मैं सोच रहा था कि सेट पर प्रत्यक्ष केवीओ के साथ एक और अधिक सुरुचिपूर्ण समाधान है या नहीं।कुंजी-मान एक एनएसएमयूटेबलसेट

जैसा कि यह पता चला है, जब आप इसे पर्यवेक्षक जोड़ने का प्रयास करते हैं तो एनएसएससेट अपवाद उठाएगा। आश्चर्य की बात नहीं है, क्योंकि संभवतः कोई नामित कीपैथ देखने के लिए नहीं है। The documentation अपवाद के बारे में बहुत स्पष्ट है, लेकिन मैं सुझाव वैकल्पिक हल समझ में नहीं आता:

इसके बजाय एक सेट अवलोकन की, अव्यवस्थित से-अनेक संबंध है जिसके लिए सेट संबंधित वस्तुओं का संग्रह है निरीक्षण।

क्या कोई इसका मतलब दोहरा सकता है? और फिर एक कामकाज कैसा दिखता है?

+1

कुछ संबंधित चर्चाएं निम्नलिखित लिंक में मिल सकती हैं http://stackoverflow.com/questions/1610422/kvo-on-an-nscountedset –

उत्तर

6

कहने का एक बहुत घने तरीका है कि "सेट खुद को एक पर्यवेक्षक नहीं जोड़ते हैं, वर्ग सेट होता है करने के लिए एक पर्यवेक्षक जोड़ने":

[myObjWithASetAsIvar addObserver:self 
         forKeyPath:@"nameOfIvarHoldingTheSet" 
         options:NSKeyValueObservingOptionNew 
         context:nil]; 

एक मुश्किल सा है कि आप की जरूरत है उचित सूचनाओं को भेजने के लिए सेट पर अपनी सभी एक्सेसों को लपेटने के लिए। वर्ग समूह होता है में:

[self willChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 
// Do something with the set 
[self didChangeValueForKey:@"nameOfIvarHoldingTheSet"]; 

वहाँ भी दो सूचना विधियां सेट के लिए विशेष रूप से कर रहे हैं: willChangeValueForKey:withSetMutation:usingObjects: और didChangeValueForKey:withSetMutation:usingObjects:; आप पाते हैं कि वे सामान्य "मूल्य परिवर्तन" विधियों की तुलना में आपके लिए बेहतर काम करते हैं।

सभी ने कहा, मुझे विश्वास है कि आपके पहले अनुच्छेद में उल्लिखित समाधान, और गिरीश से जुड़े प्रश्न में outlined by Peter Hosey, शायद जाने का सबसे अच्छा तरीका है।

+0

ग्रेट, जो मैं अंत में समझता हूं :) मैं गया और लिखा है सुझाव के अनुसार, मेरे स्वयं के एक्सेसर्स, और केवीओ के बारे में अभी कुछ और जानते हैं। धन्यवाद जोश और गिरीश! – epologee

1

NSSet पर एप्पल के प्रलेखन से (और, अनुमान और निहितार्थ से, NSMutableSet):

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

मुझे खुशी है कि आप एक जवाब है, लेकिन तथ्य यह है (है कि आप आप एक NSSet पर addObserver इस्तेमाल कर सकते हैं ग्रहण में) है कि अपने प्रारंभिक दृष्टिकोण त्रुटिपूर्ण था पाया है लगते हूँ, इस जरूरत का उल्लेख किया जाना, परवाह किए बिना।

0

यह वास्तव में बहुत स्पष्ट है जब आप इसे एक उदाहरण से संबंधित हैं:

आप एक वर्ग बैंक है कि खातों की एक NSSet है है, तो, Bank.accounts पर पर्यवेक्षक जोड़ने खाते पर पर्यवेक्षक न जोड़ें। बैंक

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