दिलचस्प पोस्ट
एकाधिक स्ट्रिंग मैचों को खोजने के लिए एल्गोरिथ्म Magento – पर्यवेक्षक विधि से ग्राहक को पुन: निर्देशित करें मेरे 'तीसरे पक्ष सर्वर' पर जीकेएलोकलप्लेयर को प्रमाणित करने के लिए कैसे? एक सूची में एक तत्व की घटनाओं की संख्या की गणना कैसे करें jQuery – एकाधिक $ (दस्तावेज़) .ready …? AngularJS आंशिक दृश्य के आधार पर कैसे हेडर को गतिशील रूप से बदलना है? क्या आप तीर कार्य बाँध सकते हैं? जावास्क्रिप्ट कैसे एक स्ट्रिंग से पाठ को हटाने के लिए URLValueCollection यूआरएल क्वेरी करने के लिए? जावा में छवि को कुशलता से रंग दें Symfony 2 EntityManager इंजेक्शन में सेवा क्यों जावास्क्रिप्ट में eval असुरक्षित है? संबंधित आवृत्तियों / अनुपात के साथ dplyr जावा में सिंगलटन के रूप में एन्यूम का उपयोग करने के लिए सबसे अच्छा तरीका क्या है? पिछले आइटम को एनजी-दोहरा में कैसे प्राप्त करें?

NSOrderedSet उत्पन्न एक्सेसर्स में फेंक दिया अपवाद

मेरे शेर ऐप पर, मेरे पास यह डेटा मॉडल है:

यहां छवि विवरण दर्ज करें

Item भीतर रिश्ते subitems का आदेश दिया है

एक्सकोड 4.1 (बिल्ड 4 बी 1 10) ने मेरे लिए Item.h Item.m , SubItem.hItem.h , Item.m , SubItem.h और SubItem.h

यहां Item.h की सामग्री ( Item.h ) है Item.h

 #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @class SubItem; @interface Item : NSManagedObject { @private } @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSOrderedSet *subitems; @end @interface Item (CoreDataGeneratedAccessors) - (void)insertObject:(SubItem *)value inSubitemsAtIndex:(NSUInteger)idx; - (void)removeObjectFromSubitemsAtIndex:(NSUInteger)idx; - (void)insertSubitems:(NSArray *)value atIndexes:(NSIndexSet *)indexes; - (void)removeSubitemsAtIndexes:(NSIndexSet *)indexes; - (void)replaceObjectInSubitemsAtIndex:(NSUInteger)idx withObject:(SubItem *)value; - (void)replaceSubitemsAtIndexes:(NSIndexSet *)indexes withSubitems:(NSArray *)values; - (void)addSubitemsObject:(SubItem *)value; - (void)removeSubitemsObject:(SubItem *)value; - (void)addSubitems:(NSOrderedSet *)values; - (void)removeSubitems:(NSOrderedSet *)values; @end 

और यहां Item.m की सामग्री ( Item.m ) है Item.m

 #import "Item.h" #import "SubItem.h" @implementation Item @dynamic name; @dynamic subitems; @end 

जैसा कि आप देख सकते हैं, वर्ग Item addSubitemsObject: नामक एक विधि प्रदान करता है:। दुर्भाग्य से, जब इस तरह से इसका उपयोग करने का प्रयास किया जाता है:

 Item *item = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:self.managedObjectContext]; item.name = @"FirstItem"; SubItem *subItem = [NSEntityDescription insertNewObjectForEntityForName:@"SubItem" inManagedObjectContext:self.managedObjectContext]; [item addSubitemsObject:subItem]; 

यह त्रुटि दिखाई देती है:

 2011-09-12 10:28:45.236 Test[2002:707] *** -[NSSet intersectsSet:]: set argument is not an NSSet 

क्या आप मेरी मदद कर सकते हैं?

अद्यतन करें:

मेरी बग रिपोर्ट से सिर्फ 1,787 दिनों के बाद, आज (1 अगस्त 2016) एप्पल ने मुझे यह लिखा: "कृपया नवीनतम आईओएस 10 बीटा निर्माण के साथ इस समस्या को सत्यापित करें और अपने परिणामों के साथ bugreport.apple.com पर अपनी बग रिपोर्ट अपडेट करें।" । आइए आशा है कि यह सही समय है 🙂

Solutions Collecting From Web of "NSOrderedSet उत्पन्न एक्सेसर्स में फेंक दिया अपवाद"

मैंने आपके सेटअप को अपने डेटा मॉडल के साथ और अलग-अलग नामों के साथ अपना एक पुन: प्रस्तुत किया है। मुझे दोनों ही मामलों में एक ही त्रुटि मिली।

ऐसा लगता है कि एप्पल के ऑटोजनरेटेड कोड में एक बग है

मैं सहमत हूं कि यहां एक बग हो सकता है। मैंने NSMutableOrderedSet को ठीक से जोड़ने के लिए ऑब्जेक्ट सेटर को जोड़ने के कार्यान्वयन को संशोधित किया है।

 - (void)addSubitemsObject:(SubItem *)value { NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.subitems]; [tempSet addObject:value]; self.subitems = tempSet; } 

स्वयं को सेट करने के लिए पुन: हस्ताक्षर करना। शूटीम्स यह सुनिश्चित करेगा कि विल / दी चेंज वैल्यू नोटिफिकेशन भेजे जाएंगे।

मैंने सभी आवश्यक तरीकों को लागू करके समाधान में सुधार करने का निर्णय लिया है:

 static NSString *const kItemsKey = @"<#property#>"; - (void)insertObject:(<#Type#> *)value in<#Property#>AtIndex:(NSUInteger)idx { NSIndexSet* indexes = [NSIndexSet indexSetWithIndex:idx]; [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:kItemsKey]; NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; [tmpOrderedSet insertObject:value atIndex:idx]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:kItemsKey]; } - (void)removeObjectFrom<#Property#>AtIndex:(NSUInteger)idx { NSIndexSet* indexes = [NSIndexSet indexSetWithIndex:idx]; [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:kItemsKey]; NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; [tmpOrderedSet removeObjectAtIndex:idx]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:kItemsKey]; } - (void)insert<#Property#>:(NSArray *)values atIndexes:(NSIndexSet *)indexes { [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:kItemsKey]; NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; [tmpOrderedSet insertObjects:values atIndexes:indexes]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:kItemsKey]; } - (void)remove<#Property#>AtIndexes:(NSIndexSet *)indexes { [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:kItemsKey]; NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; [tmpOrderedSet removeObjectsAtIndexes:indexes]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:kItemsKey]; } - (void)replaceObjectIn<#Property#>AtIndex:(NSUInteger)idx withObject:(<#Type#> *)value { NSIndexSet* indexes = [NSIndexSet indexSetWithIndex:idx]; [self willChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:kItemsKey]; NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; [tmpOrderedSet replaceObjectAtIndex:idx withObject:value]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:kItemsKey]; } - (void)replace<#Property#>AtIndexes:(NSIndexSet *)indexes with<#Property#>:(NSArray *)values { [self willChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:kItemsKey]; NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; [tmpOrderedSet replaceObjectsAtIndexes:indexes withObjects:values]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:kItemsKey]; } - (void)add<#Property#>Object:(<#Type#> *)value { NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; NSUInteger idx = [tmpOrderedSet count]; NSIndexSet* indexes = [NSIndexSet indexSetWithIndex:idx]; [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:kItemsKey]; [tmpOrderedSet addObject:value]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:kItemsKey]; } - (void)remove<#Property#>Object:(<#Type#> *)value { NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; NSUInteger idx = [tmpOrderedSet indexOfObject:value]; if (idx != NSNotFound) { NSIndexSet* indexes = [NSIndexSet indexSetWithIndex:idx]; [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:kItemsKey]; [tmpOrderedSet removeObject:value]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:kItemsKey]; } } - (void)add<#Property#>:(NSOrderedSet *)values { NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; NSUInteger valuesCount = [values count]; NSUInteger objectsCount = [tmpOrderedSet count]; for (NSUInteger i = 0; i < valuesCount; ++i) { [indexes addIndex:(objectsCount + i)]; } if (valuesCount > 0) { [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:kItemsKey]; [tmpOrderedSet addObjectsFromArray:[values array]]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:kItemsKey]; } } - (void)remove<#Property#>:(NSOrderedSet *)values { NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self mutableOrderedSetValueForKey:kItemsKey]]; NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; for (id value in values) { NSUInteger idx = [tmpOrderedSet indexOfObject:value]; if (idx != NSNotFound) { [indexes addIndex:idx]; } } if ([indexes count] > 0) { [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:kItemsKey]; [tmpOrderedSet removeObjectsAtIndexes:indexes]; [self setPrimitiveValue:tmpOrderedSet forKey:kItemsKey]; [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:kItemsKey]; } } 

हां, यह निश्चित रूप से एक कोर डेटा बग है मैंने एक ObjC-Runtime- आधारित कुछ समय पहले ठीक लिखा था, लेकिन उस समय मैंने सोचा कि यह जल्द ही तय हो जाएगी। वैसे भी, ऐसा कोई भाग्य नहीं है, इसलिए मैंने इसे GITHub पर KCOrdiredAccessorFix के रूप में पोस्ट किया । अपने सभी संस्थाओं पर समस्या के आसपास काम करें:

 [managedObjectModel kc_generateOrderedSetAccessors]; 

विशेष रूप से एक इकाई:

 [managedObjectModel kc_generateOrderedSetAccessorsForEntity:entity]; 

या सिर्फ एक संबंध के लिए:

 [managedObjectModel kc_generateOrderedSetAccessorsForRelationship:relationship]; 

रिश्तों के NSMutableOrderedSet तक पहुंच प्राप्त करने के लिए मैं प्रतिलिपि बनाने के बजाय NSObject में एक्सेसर का उपयोग करने का सुझाव देता हूं

 - (void)addSubitemsObject:(SubItem *)value { NSMutableOrderedSet* tempSet = [self mutableOrderedSetValueForKey:@"subitems"]; [tempSet addObject:value]; } 

उदाहरण के लिए आईओएस v5.0 के लिए कोर डेटा रिलीज नोट्स यह देखें।

एक छोटी परीक्षा में यह मेरे आवेदन में काम किया।

मैंने बग को ट्रैक किया है यह willChangeValueForKey:withSetMutation:usingObjects: में होता है willChangeValueForKey:withSetMutation:usingObjects: :।

यह कॉल अधिसूचनाओं की एक श्रृंखला को सेट करता है जो ट्रैक करना मुश्किल हो सकता है, और निश्चित तौर पर एक उत्तरदाता के बदले दूसरे के लिए निहितार्थ हो सकता है, जिस पर मुझे संदेह है कि क्यों एप्पल ने कुछ नहीं किया है

हालांकि, सेट में ठीक है और ऑर्डर किए गए किसी सेट पर ऑपरेशन केवल यह है कि खराबी इसका मतलब है कि केवल चार तरीके हैं जिन्हें बदलने की आवश्यकता है। इसलिए, मैंने सभी सेट ऑपरेशन्स को उनके समतुल्य सरणी संचालन में बदल दिया था। ये काम पूरी तरह से और न्यूनतम (लेकिन आवश्यक) ओवरहेड्स

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

 - (void)addChildrenObject:(BAFinancialItem *)value { if ([self.children containsObject:value]) { return; } NSIndexSet * indexSet = [NSIndexSet indexSetWithIndex:self.children.count]; [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indexSet forKey:ChildrenKey]; [[self primitiveValueForKey:ChildrenKey] addObject:value]; [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indexSet forKey:ChildrenKey]; } - (void)removeChildrenObject:(BAFinancialItem *)value { if (![self.children containsObject:value]) { return; } NSIndexSet * indexSet = [NSIndexSet indexSetWithIndex:[self.children indexOfObject:value]]; [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexSet forKey:ChildrenKey]; [[self primitiveValueForKey:ChildrenKey] removeObject:value]; [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexSet forKey:ChildrenKey]; } - (void)addChildren:(NSOrderedSet *)values { if ([values isSubsetOfOrderedSet:self.children]) { return; } NSIndexSet * indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(self.children.count, values.count)]; [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indexSet forKey:ChildrenKey]; [[self primitiveValueForKey:ChildrenKey] unionOrderedSet:values]; [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indexSet forKey:ChildrenKey]; } - (void)removeChildren:(NSOrderedSet *)values { if (![self.children intersectsOrderedSet:values]) { return; } NSIndexSet * indexSet = [self.children indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [values containsObject:obj]; }]; [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexSet forKey:ChildrenKey]; [[self primitiveValueForKey:ChildrenKey] minusOrderedSet:values]; [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexSet forKey:ChildrenKey]; } 

बेशक, एक आसान समाधान है यह निम्नानुसार है;

 - (void)addChildrenObject:(BAFinancialItem *)value { if ([self.children containsObject:value]) { return; } [self insertObject:value inChildrenAtIndex:self.children.count]; } - (void)removeChildrenObject:(BAFinancialItem *)value { if (![self.children containsObject:value]) { return; } [self removeObjectFromChildrenAtIndex:[self.children indexOfObject:value]]; } - (void)addChildren:(NSOrderedSet *)values { if ([values isSubsetOfOrderedSet:self.children]) { return; } [self insertChildren:values atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(self.children.count, values.count)]]; } - (void)removeChildren:(NSOrderedSet *)values { if (![self.children intersectsOrderedSet:values]) { return; } [self removeChildrenAtIndexes:[self.children indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [values containsObject:obj]; }]]; } 

एप्पल डॉक्स टू कई रिलेशंस कहता है: आपको प्रॉक्सी म्यूटेट करने योग्य सेट का उपयोग करना चाहिए या का उपयोग करके सेट करना चाहिए

 NSMutableOrderedSet * set = [managedObject mutableOrderedSetValueForKey:@"toManyRelation"]; 

इस सेट को संशोधित करना आपके प्रबंधित ऑब्जेक्ट में संबंध जोड़ देगा या निकाल देगा। एक्सेसर का उपयोग करके म्यूटेट किए गए आदेश को एक्सेस करना, चाहे [] या अंकन गलत है और विफल हो जाएगा

वही त्रुटि प्राप्त हुई, @ लेईआईआई समाधान ने मेरे लिए काम किया (धन्यवाद!)। मैं इसे थोड़ा संशोधित सुझाव:

  • नई पद्धति को संग्रहित करने के लिए उद्देश्य- c श्रेणी का उपयोग करें (यदि आइटम फिर से उत्पन्न होता है तो हम अपनी पद्धति को खो देंगे)
  • जांचें कि क्या हमारे पास पहले से अस्थिर सेट है

Item+category.m की सामग्री:

 #import "Item+category.h" @implementation Item (category) - (void)addSubitemsObject:(SubItem *)value { if ([self.subitems isKindOfClass:[NSMutableOrderedSet class]]) { [(NSMutableOrderedSet *)self.subitems addObject:value]; } else { NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.subitems]; [tempSet addObject:value]; self.subitems = tempSet; } } @end 

यदि आप मॉगेनरेटर का उपयोग कर रहे हैं, तो इसके बजाय

 [parentObject add<Child>sObject:childObject]; 

बस का उपयोग करें:

 [[parent object <child>sSet] addObject:childObject]; 

निजी तौर पर मैंने कोरडेटा उत्पन्न विधियों को बस स्थानांतरित कर दिया है, जिस तरीके से सीधी कॉल के साथ एक चरण में @ स्टीफ़न द्वारा उल्लिखित किया गया है:

 NSMutableOrderedSet* tempSet = [self mutableOrderedSetValueForKey:@"subitems"]; [tempSet addObject:value]; [tempSet addObject:value]; 

इससे उन श्रेणियों की आवश्यकता को हटाया जा सकता है जो बाद में एप्पल के समाधान से जेनरेट किए गए कोड के लिए संघर्ष के साथ संघर्ष कर सकता है जब बग ठीक हो जाता है।

यह करने के लिए आधिकारिक तरीके से जोड़ा हुआ जोड़ा है!

ऐसा लगता है कि यदि आप माता-पिता को बच्चे से माता-पिता को निर्धारित करते हैं और बच्चे को दूसरे स्थान पर नहीं तो दुर्घटनाग्रस्त होने के बिना काम करता है

तो अगर आप ऐसा करते हैं:

 [child setParent:parent] 

के बजाय

 [parent setChildObects:child] 

यह काम करना चाहिए, कम से कम यह आईओएस 7 पर काम करता है और रिश्ते के साथ कोई समस्या नहीं थी।

मेरे पास एक ही समस्या थी, लेकिन जब मैंने कुछ करने की कोशिश की तो मैं क्या कर रहा था। मैं उप-आईटम के लिए कोड नहीं देख सकता, लेकिन मैं मानूंगा कि इसमें आइटम का रिवर्स लिंक है। इस श्रद्धा लिंक को "माता-पिता आईटीएम" कहते हैं, तो सबसे आसान उपाय यह है:

 Item *item = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:self.managedObjectContext]; item.name = @"FirstItem"; SubItem *subItem = [NSEntityDescription insertNewObjectForEntityForName:@"SubItem" inManagedObjectContext:self.managedObjectContext]; //[item addSubitemsObject:subItem]; subItem.parentItem = item; 

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

मैं सिर्फ इस मुद्दे पर गड़बड़ी कर चुका हूं, और इसे दूसरों की तुलना में बहुत सरल क्रियान्वयन के साथ हल किया है। उप-क्लासेस का उपयोग न करने पर रिश्तों से निपटने के लिए मैं केवल NSManagedObject पर उपलब्ध तरीकों का उपयोग करता हूं।

एक NSOrderedSet संबंध में एक इकाई डालने के लिए एक उदाहरण कार्यान्वयन इस तरह दिखेगा:

 - (void)addAddress:(Address *)address { if ([self.addresses containsObject:address]) { return; } // Use NSManagedObject's methods for inserting an object [[self mutableOrderedSetValueForKey:@"addresses"] addObject:address]; } 

यह पूरी तरह से काम करता है, और यह है कि इससे पहले कि मैं NSManagedObject subclasses में ले जाया गया था, इससे पहले मैं उपयोग कर रहा था

XCode 7 के साथ उद्देश्य-सी से स्विफ्ट 2 तक की प्रोजेक्ट को माइग्रेट करते समय यह समस्या मेरे पास आई थी यह प्रोजेक्ट काम करने के लिए प्रयोग किया जाता है, और एक अच्छे कारण के लिए: मैं MOGenerator का उपयोग कर रहा था जो इस बग को ठीक करने के लिए प्रतिस्थापन विधियों था। लेकिन सभी विधियों को प्रतिस्थापन की आवश्यकता नहीं है

तो यहां एक उदाहरण वर्ग के साथ पूरा समाधान है, जितना संभव हो डिफ़ॉल्ट एक्सेसर्स पर निर्भर।

मान लीजिए कि हमारे पास क्रमबद्ध मदों के साथ एक सूची है

सबसे पहले एक त्वरित जीत अगर आपके पास एक / कई-कई रिश्ते हैं, तो सबसे आसान तरीका है:

 item.list = list 

के बजाय

 list.addItemsObject(item) 

अब, अगर यह एक विकल्प नहीं है , तो यह है कि आप क्या कर सकते हैं:

 // Extension created from your DataModel by selecting it and // clicking on "Editor > Create NSManagedObject subclass…" extension List { @NSManaged var items: NSOrderedSet? } class List // Those two methods work out of the box for free, relying on // Core Data's KVC accessors, you just have to declare them // See release note 17583057 https://developer.apple.com/library/prerelease/tvos/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc7_release_notes.html @NSManaged func removeItemsObject(item: Item) @NSManaged func removeItems(items: NSOrderedSet) // The following two methods usually work too, but not for NSOrderedSet // @NSManaged func addItemsObject(item: Item) // @NSManaged func addItems(items: NSOrderedSet) // So we'll replace them with theses // A mutable computed property var itemsSet: NSMutableOrderedSet { willAccessValueForKey("items") let result = mutableOrderedSetValueForKey("items") didAccessValueForKey("items") return result } func addItemsObject(value: Item) { itemsSet.addObject(value) } func addItems(value: NSOrderedSet) { itemsSet.unionOrderedSet(value) } end 

बेशक, यदि आप उद्देश्य-सी का उपयोग कर रहे हैं, तो आप वही चीज कर सकते हैं क्योंकि यह पहला स्थान है जहां मुझे यह विचार मिला है 🙂

मैं सहमत हूं कि यहां एक बग हो सकता है। मैंने एम्स ऑब्जेक्ट के कार्यान्वयन को संशोधित किया है> सेटर को एनएसएमयूटीबलऑर्डेडसेट पर सही ढंग से जोड़ने के लिए

 - (void)addSubitemsObject:(SubItem *)value { NSMutableOrderedSet* tempSet = [NSMutableOrderedSet orderedSetWithOrderedSet:self.subitems]; [tempSet addObject:value]; self.subitems = tempSet; } 

स्वयं को सेट करने के लिए पुन: असाइन करना। शूटीम्स यह सुनिश्चित करेगा कि विल / दी चेंज वैल्यू नोटिफिकेशन> भेजे जाते हैं।

Leelll, क्या आप सुनिश्चित हैं कि इस सेट में संग्रहीत NSMutableOrderedSet मानों की ऐसी कस्टम सेटअप के बाद डेटाबेस को कोरडाटा द्वारा सही ढंग से सहेजा जाएगा? मैंने उस की जांच नहीं की, लेकिन ऐसा लगता है कि कोरडाटा एनएसओर्डेडसेट के बारे में कुछ नहीं जानता है और एनएसएसईट को कई रिश्ते कंटेनर की उम्मीद है।

मुझे लगता है कि हर कोई वास्तविक समस्या खो रहा है यह NSOrderedSet तरीके में नहीं है, बल्कि इस तथ्य में है कि NSOrderedSet NSSet उपवर्ग नहीं है। तो जब -interSectsSet: एक आदेश के साथ कहा जाता है तर्क के रूप में सेट यह विफल रहता है

 NSOrderedSet* setA = [NSOrderedSet orderedSetWithObjects:@"A",@"B",@"C",nil]; NSSet* setB = [NSSet setWithObjects:@"C",@"D", nil]; [setB intersectsSet:setA]; 

*** -[NSSet intersectsSet:]: set argument is not an NSSet साथ विफल *** -[NSSet intersectsSet:]: set argument is not an NSSet

ऐसा लगता है कि फिक्स सेट ऑपरेटर के कार्यान्वयन को बदलने के लिए है ताकि वे प्रकार को पारदर्शी ढंग से संभाल सकें। किसी कारण का कोई कारण नहीं -intersectsSet: कोई भी आदेश या -intersectsSet: सेट के साथ काम करना चाहिए।

अपवाद परिवर्तन अधिसूचना में होता है संभाव्यतः उस कोड में जो व्युत्क्रम संबंधों को संभालता है Since it only happens if I set an inverse relationship.

The following did the trick for me

 @implementation MF_NSOrderedSetFixes + (void) fixSetMethods { NSArray* classes = [NSArray arrayWithObjects:@"NSSet", @"NSMutableSet", @"NSOrderedSet", @"NSMutableOrderedSet",nil]; [classes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSString* name = obj; Class aClass = objc_lookUpClass([name UTF8String]); [MF_NSOrderedSetFixes fixMethodWithSetArgument:@selector(intersectsSet:) forClass:aClass]; [MF_NSOrderedSetFixes fixMethodWithSetArgument:@selector(isSubsetOfSet:) forClass:aClass]; }]; } typedef BOOL (*BoolNSetIMP)(id _s,SEL sel, NSSet*); /* Works for all methods of type - (BOOL) method:(NSSet*) aSet */ + (void) fixMethodWithSetArgument:(SEL) aSel forClass:(Class) aClass { /* Check that class actually implements method first */ /* can't use get_classInstanceMethod() since it checks superclass */ unsigned int count,i; Method method = NULL; Method* methods = class_copyMethodList(aClass, &count); if(methods) { for(i=0;i<count;i++) { if(method_getName(methods[i])==aSel) { method = methods[i]; } } free(methods); } if(!method) { return; } // Get old implementation BoolNSetIMP originalImp = (BoolNSetIMP) method_getImplementation(method); IMP newImp = imp_implementationWithBlock(^BOOL(NSSet *_s, NSSet *otherSet) { if([otherSet isKindOfClass:[NSOrderedSet class]]) { otherSet = [(NSOrderedSet*)otherSet set]; } // Call original implementation return originalImp(_s,aSel,otherSet); }); method_setImplementation(method, newImp); } @end 

I just got the problem in Swift (Xcode 6.1.1).

The answer was DO NOT CODE ANY METHOD OR ADDITIONAL THINGS in your NSManagedObject subclasses. I think it is a compilator mistake. Very strange bug ..

Hope it helps ..

I solved this problem by set the inverse to No Inverse, I don't know why, Maybe there is Apple Bug. यहां छवि विवरण दर्ज करें

I have the same situation with an item called "signals" instead of "subitems". The solution with tempset works in my testing. Further, I had a problem with the removeSignals: method. This override seems to work:

 - (void)removeSignals:(NSOrderedSet *)values { NSMutableOrderedSet* tempset = [NSMutableOrderedSet orderedSetWithOrderedSet:self.signals]; for (Signal* aSignal in values) { [tempset removeObject:aSignal]; } self.signals = tempset; } 

If there is a better way to do this, please let me know. My values input is never more than 10 -20 items so performance isn't much of a concern – nonetheless please point out anything relevant.

धन्यवाद,

Damien

I found this question by googling for the error message, and just wanted to point out that I ran into this error in a slightly different way (not using ordered sets). This isn't quite an answer to the given question, but I'm posting it here just in case it is helpful to anyone else who stumbles across this question while searching.

I was adding a new model version, and added some relationships to existing models, and defined the add*Object methods in the header file myself. When I tried to call them, I got the error above.

After reviewing my models, I realized I had stupidly forgotten to check the "To-Many Relationship" checkbox.

So if you're running into this and you're not using ordered sets, double check your model.

I found a fix for this bug that works for me. I just replace this:

 [item addSubitemsObject:subItem]; 

with this:

 item.subitemsObject = subItem; 

I found using the method by LeeIII worked, but on profiling found it was drastically slow. It took 15 seconds to parse 1000 items. Commenting out the code to add the relationship turned 15 seconds into 2 seconds.

My workaround (which is faster but much more ugly) involves creating a temporary mutable array then copying into the ordered set when all the parsing is done. (this is only a performance win if you are going to add many relationships).

 @property (nonatomic, retain) NSMutableArray* tempItems; .... @synthesize tempItems = _tempItems; .... - (void) addItemsObject:(KDItem *)value { if (!_tempItems) { self.tempItems = [NSMutableArray arrayWithCapacity:500]; } [_tempItems addObject:value]; } // Call this when you have added all the relationships - (void) commitRelationships { if (_tempItems) { self.items = [NSOrderedSet orderedSetWithArray:self.tempItems]; self.tempItems = nil; } } 

I hope this help someone else!

Robert,

I agree your answer will work for this, but keep in mind that there is an automatically created method for adding a whole set of values to a relationship already. Apple's Documentation ( as seen here under the "To-many Relationships" section or here under the "Custom To-Many Relationship Accessor Methods" section) implements them this way:

 - (void)addEmployees:(NSSet *)value { [self willChangeValueForKey:@"employees" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value]; [[self primitiveEmployees] unionSet:value]; [self didChangeValueForKey:@"employees" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value]; } - (void)removeEmployees:(NSSet *)value { [self willChangeValueForKey:@"employees" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value]; [[self primitiveEmployees] minusSet:value]; [self didChangeValueForKey:@"employees" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value]; } 

You could easily compile your set of relationships outside of core data and then add them all at once using this method. It might be less ugly than the method you suggested 😉

I'm quite sure it is finally fixed in iOS 10 beta 6 !