2008-09-24 17 views
11

ऐप्पल के documentation on -setPrimitiveValue:forKey: कई तरीकों से अस्पष्ट है ताकि कई रिश्तों को प्रबंधित करने के लिए इसका उपयोग किया जा सके।setPrimitiveValue: forKey: और कई रिश्तों

पहले वे राज्य:

आप एक नया NSMutableSet ऑब्जेक्ट में एक से-अनेक संबंध स्थापित करने के लिए प्रयास करते हैं तो यह (अंततः) असफल हो जायेगी।

आखिरकार ?! इसका क्या अर्थ है? क्या यह -[NSManagedObjectContext save:] के दौरान बाद में विफल हो जाएगा? जब एक प्रबंधित ऑब्जेक्ट को गलती में बदल दिया जाता है और फिर वापस पेज किया जाता है? कब? क्या मैं लगातार मांग में विफलता को फिर से बनाने के लिए एक टेस्ट केस लिख सकता हूं?

दूसरा, नमूना कोड उपलब्ध कराने के सही ढंग से इस मामले को संभालने के लिए, वे लिखते हैं:

पहले primitiveValueForKey: का उपयोग कर (विधि सुनिश्चित nil वापस नहीं करता है)

मुझे क्या करना चाहिए मौजूदा सेट प्राप्त अगर/0 विधि वापसी शून्य है? assert() यह और तुरंत विफल हो गया क्योंकि इसका मतलब है कि संपूर्ण ऑब्जेक्ट ग्राफ़ दूषित हो गया है और बचत डेटा हानि का कारण बन जाएगी? कॉलर को चेतावनी के रूप में NSAssert() पर दबाएं लेकिन (चुपचाप कुछ भी नहीं कर रहा है) दबाएं?

अभी मैं बस सीधे बताए कर रहा हूँ मेरी वांछित उस मामले में NS[Mutable]Set, इसलिए जैसे:

- (void)setChildren:(NSSet*)value_ { 
    NSMutableSet *mutableRelationshipSet = [[[self primitiveValueForKey:@"children"] mutableCopy] autorelease]; 
    if (mutableRelationshipSet) { 
     [mutableRelationshipSet setSet:value_]; 
     [self setPrimitiveValue:mutableRelationshipSet forKey:@"children"]; 
    } else { 
     [self setPrimitiveValue:value_ forKey:@"children"]; 
    } 
} 

कि गलत है?

उत्तर

6

बस एक म्यूटेबल सेट के रूप में -primitiveValueForKey: के वापसी मूल्य को म्यूटेट करें, भरोसा है कि इसका वापसी मूल्य सही काम करेगा।

अपने मैनिपुलेशन के आसपास -willChangeValueForKey:withSetMutation:usingObjects: और -didChangeValueForKey:withSetMutation:usingObjects: का भी उपयोग करना सुनिश्चित करें; आपने इसे अपने उपरोक्त कोड में नहीं दिखाया।

- (void)setChildren:(NSSet *)value { 
    [self willChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value]; 

    NSMutableSet *primitiveValue = [self primitiveValueForKey:@"children"]; 

    [primitiveValue setSet:value]; 

    [self didChangeValueForKey:@"children" withSetMutation:NSKeyValueSetSetMutation usingObjects:value]; 
} 

यदि आप तेंदुए को लक्षित कर सकते हैं, तो आपको इसके बारे में चिंता करने की ज़रूरत नहीं है; आप उपयोग कर सकते कोर डाटा के अंतर्निहित बजाय संपत्ति का समर्थन:

#import <CoreData/CoreData.h> 

@interface Folder : NSManagedObject 
@property (readwrite, retain) NSSet *children; 
@end 

@implementation Folder 
@dynamic children; 
@end 

कोर डाटा ताकि आप इसे पर -mutableSetValueForKey: उपयोग कर सकते हैं, साथ ही children संपत्ति लेकिन परिवर्तनशील सेट accessors के लिए न केवल एक गेटर/सेटर जोड़ी उत्पन्न होगा और कम से कम ओवरहेड के साथ परिणाम में हेरफेर।

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