এনএসআরআরডসেট উত্পন্ন অ্যাক্সেসরগুলিতে ব্যতিক্রম


364

আমার সিংহ অ্যাপটিতে আমার এই ডেটা মডেলটি রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

subitemsভিতরে সম্পর্কItem আদেশ করা হয়

Xcode 4.1 (4B110 বিল্ড) আমার জন্য ফাইল তৈরি করেছে Item.h, Item.m,SubItem.h এবং SubItem.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:

#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 বিটা বিল্ড দিয়ে যাচাই করুন এবং আপনার ফলাফলের সাথে বাগেরপোর্ট.এপল.কম এ আপনার বাগ রিপোর্ট আপডেট করুন" " । আসুন আশা করি এটি সঠিক সময় :)


5
আমি একই সমস্যা দেখছি। আশা করি এটি শিগগিরই ঠিক হয়ে গেছে। যদিও পরিবর্তিত অর্ডারযুক্ত সেটটি সরাসরি ব্যবহার করা আপাতত সহজ কাজ। দ্রষ্টব্য: আমি মোজেনেরেটরটি ব্যবহার করছি তবে আমি ধরে নিয়েছি এটি উত্পন্ন কোডের এই অংশের জন্য অভ্যন্তরীণভাবে একই অ্যাপল জেনারেটরটি ব্যবহার করছে।
চাদ পোডোস্কি

12
এটি প্রায় 2 বছর! আপনি এটি আইওএস 7, অ্যাপল এ ঠিক করবেন? This এই বাগটি এখনও রয়েছে কিনা তা নিয়ে আমি ভাবছি তাদের সাথে ভাগ করে নিতে চাই: "হ্যাঁ, এটি আছে is"
an0

1
এখন দুই বছরের খুব কাছাকাছি, এটি এখনও সমস্ত এক্সকোড 5 বিকাশকারী পূর্বরূপে একটি সমস্যা an
কোরভিন জ্যাজানো

2
আপনি যদি যথাযথ কেভিসি অ্যাক্সেসর ব্যবহার করেন তবে কি এখনও সমস্যাটি দেখছেন? (অর্থাত mutableOrderedSetValueForKey:)
quellish

3
ম্যাভারিক্সে এখনও একটি সমস্যা বলে মনে হচ্ছে।
টিম

উত্তর:


263

আমি আপনার সেটআপটি আপনার ডেটা মডেল এবং আমার নিজের একটিতে বিভিন্ন নামের সাথে পুনরুত্পাদন করেছি। উভয় ক্ষেত্রেই আমি একই ত্রুটি পেয়েছি।

অ্যাপলের অটোজেনারেটেড কোডে বাগের মতো দেখতে মনে হচ্ছে।


60
বাগ আইডি 10114310 It এটি 13-সেপ্টেম্বর -2011 তে রিপোর্ট করা হয়েছিল তবে আজ (15-জানুয়ারি -2012) এটি এখনও "খোলা" আছে। একই সমস্যা রয়েছে এমন লোকের সংখ্যা বিবেচনা করে এটি অবিশ্বাস্য।
দেব

14
আপডেট: আজ (11 ই মে, 2012) বাগ # 10114310 এখনও খোলা আছে, আমার রিপোর্টের 241 দিন পরে (13 সেপ্টেম্বর, 2011)। অবিশ্বাস্য.
দেব

23
আমি কেবল ডাব্লুডাব্লুডিসিতে কোরডাটা ল্যাব সেশনের সময় একটি অ্যাপল ইঞ্জিনিয়ারের সাথে এটি নিয়ে এসেছি। তারা বিষয়টি স্বীকার করে নিল যে এটি একটি আসল বাগ, এবং যা আমি দেখেছি এটির "সমালোচনামূলক" অবস্থা রয়েছে তবে অবশ্যই তারা কখন এটি সমাধান করবেন তা নিয়ে কোনও প্রতিশ্রুতি নেই। আমি এটি iOS6 / মাউন্টেন সিংহ মধ্যে স্থির করা হবে বলে মনে করি না। আমি মনে করি এই রাডারটি আরও নকল করা ভাল। বর্তমানে এটির প্রায় 25 টি ডুপ রয়েছে, আরও ভাল!
ডাগামস

40
আজই সন্ধান করা হয়েছে, এটি এখনও আইওএস 7 জিএম / ওএমজি-তে রয়েছে! আমি এটি বিশ্বাস করতে পারি না…
an0

79
আপডেট: 7৯7 দিন, 2 টি বড় বড় আইওএস সংস্করণ এবং অগনিত এক্সকোড সংস্করণগুলি পেরিয়ে গেছে যখন আমি # 10114310 ত্রুটিটি পূরণ করেছি। এবং এটি এখনও "উন্মুক্ত"। অবিশ্বাস্য.
দেব

244

আমি একমত যে এখানে একটি বাগ থাকতে পারে। আমি একটি এনএসমিটেবলআরডসেটে সঠিকভাবে সংযোজন করতে অ্যাড অবজেক্ট সেটারের বাস্তবায়নটি পরিবর্তন করেছি।

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

সেটটি সেল্ফ.সুবিটেমগুলিতে পুনরায় জমা দেওয়া নিশ্চিত করবে যে উইল / ডিড চেঞ্জভ্যালু বিজ্ঞপ্তি প্রেরণ করা হয়েছে।


আপনার কোড স্নিপেটটি আমাকে এই সমস্যাটি সম্পর্কে জানতে প্রয়োজনীয় ছিল needed আশা করি অ্যাপল শেষ পর্যন্ত সমস্যার সমাধান করে ফেলেছে তবে এখন পর্যন্ত আমি আপনার পদ্ধতির ব্যবহার নিয়ে কোনও সমস্যা দেখিনি।
ক্রিস্টোফার হুজনেন

আমি যখন এই কাজটি চারপাশে বাস্তবায়নের চেষ্টা করি তখন আমি এই ত্রুটিটি পাচ্ছি .. [__NSArrayI isqualToSet:]: উদাহরণ হিসাবে অচেনা নির্বাচক পাঠানো হয়েছে ... এটি সাধারণত প্রকাশিত হয়েছে এমন একটি আইটেম থেকে পাওয়া যায় তবে কোথায় খুঁজে পাওয়া যায় না, কেউ চালায় এই মধ্যে?
ডেরেকএইচ

@ ডেরেএইচএইচএইএকএলটোসেটটি কেবল এনএসইটের একটি পদ্ধতি, সুতরাং আমার অনুমান যে আপনি এনএসআররে হিসাবে রূপান্তর করেছেন, তৈরি করেছেন, বা কোনও পয়েন্টারকে এনএসআর্রে হিসাবে বিবেচনা করছেন, এনএসম্যানেজডোবজেক্টে ফিরে যাওয়ার আগে যদি কোনও কারণেই কল করা উচিত তবেই সেটটি প্রয়োজন হয় কিনা তা নির্ধারণ করতে এমনকি পরিবর্তন বা হিসাবে বামে রাখা।
ইনিজজোন

3
@ মার্কআমেরি পরীক্ষিত। যাচাই. গতিশীল সেটার স্ব.সুবিটেমগুলি বিজ্ঞপ্তিগুলি প্রেরণ করে। সুতরাং JLust সমাধানটি সঠিক।
বার্নস্টেইন

3
এটি একটি ভাল উত্তর, তবে এটি অকার্যকর। আপনি পুরো অর্ডার করা সেটটি অনুলিপি করুন, সংশোধন করুন এবং তারপরে এটি অনুলিপি করুন। প্রভাব কেবল অর্ডার করা সেটগুলিতে আঘাত হানে না, তবে বিজ্ঞপ্তিগুলি প্রেরণ করা হয় যে যতবার অর্ডার করা সেটটি পরিবর্তন করা হয়, তার সম্পূর্ণ সামগ্রী পরিবর্তন করা হয়! যদি এই অর্ডার করা সেটটি কোনও ইউআইটিবেলের জন্য উদাহরণস্বরূপ ব্যবহার করা হয়, তবে এটি আপডেট করার জন্য গুরুতর পদক্ষেপ নিতে পারে। আমি আমার সমাধানটিতে ঠিক ত্রুটিটি কোথা থেকে এসেছে তা উল্লেখ করেছি এবং ত্রুটিটি বাইপাস করার জন্য আমি আরও কার্যকর পদ্ধতি দেখিয়েছি।
ওপেন গডফ্রে

111

আমি প্রয়োজনীয় সমস্ত পদ্ধতি প্রয়োগ করে সমাধানের উন্নতি করার সিদ্ধান্ত নিয়েছি:

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];
    }
}

1
ক্র্যাশ টাইপ কি? 'অপট্রজেক্টফ্রোমসুবিটেমএটিআইএনডেক্স' এই সাবাইটিমগুলি মুছে দেয় না, এগুলি এখনও আপনার স্টোরেজে বিদ্যমান রয়েছে, এটি অবজেক্টগুলির মধ্যে সম্পর্ক সরিয়ে দেওয়ার একমাত্র উপায়।
দিমিত্রি মাকারেঙ্কো 10'12

2
kItemsKey একটি ধ্রুবক যা কেবল কেভিও পদ্ধতি কলগুলিতে সুবিধার জন্য যুক্ত করা হয়েছিল। এটি অর্ডার করা সম্পর্কের একটি নাম যা আপনি নিজের পদ্ধতিগুলি লিখছেন।
দিমিত্রি মাকারেঙ্কো

1
এটাই আমার মনে হয়। ধন্যবাদ। তবে আমার সমস্যাটি হ'ল এই পদ্ধতিগুলি ব্যবহার করে ডেটাবেসে সংরক্ষণ করা হয় না।
বাগসফ্লায়ার

4
!!!!!!!!! কেবল কোডটি অনুলিপি করুন এবং পদ্ধতির নামগুলি পরিবর্তন করুন, এটি পুরোপুরি কাজ করে !!! এটি দ্রুততম উত্তর।
ফ্লাইপিগ

1
এটি ভয়ঙ্কর, তবে আদেশকৃত সেটটির অস্থায়ী অনুলিপি তৈরি করা অপ্রয়োজনীয়। অপরাধী হ'ল willChangeValueForKey:withSetMutation:usingObjects, যা আপনি সফলভাবে এড়িয়ে গেছেন। এর পরে, যথাযথ [[self primitiveValueForKey:ChildrenKey] unionOrderedSet:values]বা [[self primitiveValueForKey:ChildrenKey] minusOrderedSet:values]যথাযথ হিসাবে ব্যবহার করুন । বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
ওপেন গডফ্রে

38

হ্যাঁ, এটি অবশ্যই একটি কোর ডেটা বাগ। আমি কিছুক্ষণ আগে একটি ওজেসি-রানটাইম-ভিত্তিক ফিক্স লিখেছিলাম, কিন্তু আমি যখন অনুভব করেছি যে এটি শীঘ্রই ঠিক হয়ে যাবে। যাইহোক, এরকম কোনও ভাগ্য নেই, তাই আমি এটিকে গিটহাবের উপরে KCOrriedAccessorFix হিসাবে পোস্ট করেছি । আপনার সমস্ত সত্তায় সমস্যাটি ঘিরে কাজ করুন:

[managedObjectModel kc_generateOrderedSetAccessors];

বিশেষত একটি সত্তা:

[managedObjectModel kc_generateOrderedSetAccessorsForEntity:entity];

বা কেবল একটি সম্পর্কের জন্য:

[managedObjectModel kc_generateOrderedSetAccessorsForRelationship:relationship];

আমি ভাবছি অ্যাপল থেকে আসল ফিক্সের সাথে এই দ্বন্দ্ব হবে কিনা?
টিয়া

3
এটি অ্যাপলের স্থিরতার সাথে বিরোধী হওয়া উচিত নয়, কারণ এর উদ্দেশ্য হ'ল অ্যাপলের বাস্তবায়ন ওভাররাইড করা what কখন / যদি এটি আসলে অ্যাপল দ্বারা স্থির করা হয়, সম্ভবত আমি - (BOOL)kc_needsOrderedSetAccessorFix;এমন একটি বা এমন কিছু যুক্ত করব যা ফাউন্ডেশন / আইওএস সংস্করণ পরীক্ষা করে।
স্টার্লিং আর্চার 19

2
কোকোপডস মাস্টার রেপোতে ইতিমধ্যে একটি কেসিআরআরডআ্যাকসেসরফিক্স.পডস্পেক রয়েছে। সুতরাং আপনার প্রকল্পগুলির সাথে এটি লিঙ্ক করার জন্য আপনি কেবল নিজের পোডফাইলে "পোড 'কেসিআরআরডেডঅ্যাক্সেসরফিক্স" যুক্ত করতে পারেন
অ্যান্টন মাতোসোভ

এটির আইওএস 8 এর জন্য কিছু সমস্যা ছিল (এর জন্য ভুল পদ্ধতি স্বাক্ষর objc_msg_send)
এনএসটিজে

IOS9 এ এটি কাজ করে, দুর্দান্ত কাজ! এটি সর্বকালের সেরা সমাধান, আপনার কোডে কোনও পরিবর্তন করার দরকার নেই!
বোরজ

32

অনুলিপি তৈরির পরিবর্তে আমি সম্পর্কের NSMutableOrriedSet এ অ্যাক্সেস পেতে NSObject এ অ্যাক্সেসরটি ব্যবহার করার পরামর্শ দিই।

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

যেমন আইওএস v5.0 এর জন্য মূল ডেটা রিলিজ নোটস উল্লেখ করে refer

একটি সংক্ষিপ্ত পরীক্ষায় এটি আমার আবেদনে কাজ করে।


1
আক্ষরিক স্ট্রিংগুলি সহজেই রিফ্যাক্টর করতে পারে না। আপনি কোড ব্যবহার করেন তবে সংকলক স্ব.সুবাইটেমগুলি চেক করে টাইপ করতে পারেন।
লোগানকৌটারেল

1
@ লগানকাট্রেল হ্যাঁ এটি সঠিক। এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে অগ্রাধিকারের উপর নির্ভর করে। সাধারণভাবে আমি বিশেষত এই ক্ষেত্রে রিসোর্সগুলি বাঁচাতে ফোকাস করি কারণ এটি কেবল একটি কর্মক্ষেত্র ছিল।
স্টিফান

2
আক্ষরিক স্ট্রিং NSStringFromSelector(@selector(subitems))যদিও দ্বারা প্রতিস্থাপন করা যেতে পারে :)
জ্যাক

17

আমি বাগ ট্র্যাক করেছি। এটা ঘটে willChangeValueForKey:withSetMutation:usingObjects:

এই কলটি বিজ্ঞপ্তির একটি শৃঙ্খলা স্থাপন করে যা ট্র্যাক করা কঠিন হতে পারে, এবং অবশ্যই একজন উত্তরদাতাকে পরিবর্তন করা অন্যটির জন্য জড়িত থাকতে পারে, যা আমি সন্দেহ করি যে অ্যাপল কিছুই করেনি।

তবে এটি সেটে ঠিক আছে এবং কোনও অর্ডারসেটে এটির সেট সেট অপারেশন যা ত্রুটিযুক্ত। তার মানে কেবলমাত্র চারটি পদ্ধতি রয়েছে যা পরিবর্তন করা দরকার। অতএব, আমি যা করেছি তা হ'ল সেট অপারেশনগুলিকে তাদের সমতুল্য অ্যারে ক্রিয়াকলাপে রূপান্তরিত করা হয়েছিল। এগুলি পুরোপুরি এবং ন্যূনতম (তবে প্রয়োজনীয়) ওভারহেডগুলিতে কাজ করে।

সমালোচনামূলক পর্যায়ে, এই সমাধানটি একটি গুরুতর ত্রুটিতে ভুগছে; আপনি যদি বস্তুগুলি যুক্ত করছেন এবং কোনও একটি ইতিমধ্যে উপস্থিত রয়েছে, তবে এটি হয় যোগ করা বা আদেশ তালিকার পিছনে সরানো হয়নি (আমি জানি না যা)। উভয় ক্ষেত্রেই, আমরা পৌঁছানোর সময় অবধি অবজেক্টের প্রত্যাশিত অর্ডার সূচকটি প্রত্যাশিত didChangeচেয়ে আলাদা। এটি কিছু লোকের অ্যাপ্লিকেশনগুলি ভেঙে ফেলতে পারে তবে এটি আমার উপর প্রভাব ফেলবে না, যেহেতু আমি কেবল নতুন জিনিস যুক্ত করছি বা যুক্ত করার আগে আমি তাদের চূড়ান্ত অবস্থানগুলি নিশ্চিত করি।

- (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];
    }]];
}

খুব খারাপ অন্য সবাই মনে হয় যে এই উত্তরটিকে উপেক্ষা করেছেন, এটি অবশ্যই সেরা সমাধান হিসাবে মনে হচ্ছে।
জর্জ

একটি স্থানীয় সেট তৈরি করার জন্য অর্ডারসেটউইটআরআরডসেট ব্যবহার করাগুলির চেয়ে এই দ্রষ্টব্যটির অনেক ভাল পারফরম্যান্স রয়েছে। আপনার যখন বড় ডেটা সেট থাকে তখন এটির একটি ওভারহেড থাকে। সহজ সমাধানটি প্রদর্শিত পদ্ধতিগুলি না দেখায় কেবল প্রাথমিকের একটি রিফ্যাক্টরড সংস্করণ হিসাবে উপস্থিত হয়।
ডেভিড পেটিগ্রু 22

1
আমি এখনও অ্যাডচিল্ডারে ক্রাশ দেখতে পাচ্ছি: *** অপ্রত্যাশিত ব্যতিক্রম 'এনএসআইন্যাডলআরগমেন্টএক্সেপশন' এর কারণে অ্যাপ্লিকেশনটি সমাপ্ত করা হচ্ছে, কারণ: '- [ট্র্যাকহিসটরি সন্নিবেশ ট্র্যাকপয়েন্টস: এআইন্ডেক্সেস:]: অচেনা নির্বাচককে উদাহরণ পাঠানো হয়েছে 0x1702b1b20'
ভিক্টর বোগদান

@ ওউনগোডফ্রে সহজ সমাধানের জন্য আপনি কোথায় এই পদ্ধতিগুলি প্রয়োগ করছেন? আমি একটি ব্যতিক্রম পাচ্ছি: [পিতামাতার insertObject: inChildrenAtIndex:] অপরিজ্ঞাত নির্বাচক 0x6180000ac480 তে পাঠানো হয়েছে।
ডালমাজাও

আপনার পরিবর্তনশীল একটি মূলধন "পি" সহ "পিতামাতা"? তার মানে কি আপনি ক্লাসটিকে "পিতামাতৃ" বলছেন, বা আপনার "অভিভাবক" নামে একটি পরিবর্তনশীল পরিবর্তন আছে? যদি আমার ক্লাসটি প্যারেন্ট হয় তবে আমি পিতামাতার নীচে এই পদ্ধতিগুলি প্রয়োগ করেছি, তবে আপনাকে এটিকে একটি উদাহরণে কল করতে হবে, সম্ভবত এটি "প্যারেন্ট" নামকরণ করা হবে ছোট হাতের "পি", কারণ এগুলি শ্রেণি পদ্ধতি নয় not ।
15:51

10

অনেক সম্পর্কের অ্যাপল ডক্স বলেছেন: আপনি প্রক্সি চপল সেট অ্যাক্সেস বা ব্যবহার করে নির্ধারণ নির্দেশ

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

এই সেটটি পরিবর্তন করা আপনার পরিচালিত অবজেক্টের সাথে সম্পর্ক যুক্ত করবে বা সরিয়ে দেবে। [] সাথে বা অ্যাক্সেসর ব্যবহার করে পরিবর্তিত অর্ডারযুক্ত সেট অ্যাক্সেস করা। স্বরলিপিটি ভুল এবং ব্যর্থ হবে।


3
ন্যায়সঙ্গত হওয়ার জন্য, ডকগুলি আরও বলে: "বা স্বয়ংক্রিয়ভাবে উত্পন্ন সম্পর্কের মিউটর পদ্ধতিগুলির মধ্যে একটি (ডাইনামিকালি-জেনারেটেড অ্যাকসেসর পদ্ধতিগুলি দেখুন):"
ম্যাট

ঠিক আছে ঠিক আছে ... ঠিক বলেছেন। ঠিক আছে, তাহলে এটি বলা যাক এটি সহজ কাজ করার উপায় ...
নিকোলাস

9

একই ত্রুটিটি পেয়েছি, @ লিউআইআইআই সমাধানটি আমার পক্ষে কাজ করেছে (ধন্যবাদ!) আমি এটিকে কিছুটা সংশোধন করার পরামর্শ দিচ্ছি:

  • নতুন পদ্ধতি সঞ্চয় করতে উদ্দেশ্য-সি বিভাগ ব্যবহার করুন (যাতে আইটেমটি আবার উত্পন্ন হলে আমরা আমাদের পদ্ধতিটি হারাতে চাই না)
  • আমাদের ইতিমধ্যে পরিবর্তনীয় সেট আছে কিনা তা পরীক্ষা করে দেখুন

এর বিষয়বস্তু 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

এই কোডটি বিভাগে স্থানান্তরিত করার জন্য ভাল পয়েন্ট। তবে তবুও আমাদের উইথ / সেটপ্রিমিটিভওয়ালিউ / ডডচেনিজ কলটির সাথে ডিমিট্রি মকারেনকো উত্তরটির মতো প্রকৃত যোগ / অপসারণের দরকার need
ভ্লাদিমির শুটিউক

8

আপনি যদি মজেনেটর ব্যবহার করে থাকেন তবে তার পরিবর্তে

[parentObject add<Child>sObject:childObject];

সহজভাবে ব্যবহার করুন:

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

মোজেনেরেটর অতিরিক্ত কোডটির যত্ন নেয় কারণ অন্যথায় আপনাকে লিখতে হবে এবং কেবল অন্তর্নিহিত সেট অবজেক্টে অ্যাক্সেসের অনুমতি দেয়।
20r'hικ

দেখে মনে হচ্ছে কোনও ঠিকঠাক করা হয়েছে যার অর্থ মোজেনেটর সঠিক সংস্থাগুলি তৈরি করবে ... github.com/dmakarenko/mogenerator/commit/…
সংযুক্তি

1
আমি ব্যবহার করছি mogeneratorতবে আমার তবুও বাগ রয়েছে।
কোলাস

7

ব্যক্তিগতভাবে আমি কোরেডাটা উত্পন্ন পদ্ধতিগুলিতে কলগুলি কেবলমাত্র স্টেশনের দ্বারা অন্য সমাধানে বর্ণিত পদ্ধতিতে সরাসরি কলগুলির সাথে প্রতিস্থাপন করেছি:

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

এটি এমন বিভাগগুলির প্রয়োজনীয়তা সরিয়ে দেয় যা পরে বাগ ঠিক করা হলে অ্যাপল থেকে উত্পন্ন কোডের সমাধানের সাথে দ্বন্দ্ব করতে পারে।

এটি করার আনুষ্ঠানিক উপায় হ'ল এটির অতিরিক্ত সংযোজন!


এটি নিম্নলিখিত ত্রুটিটি দেয়: '[<CLASS 0x20886d10> মান forForUndefinedKey:]: এই শ্রেণিটি মূল সাবাইটামগুলির জন্য মূল মান কোডিং-অনুসারী নয়' '
jmstone617

যদিও এটি এখনও আমাকে শেষ করার আহ্বান জানিয়েছে যে এটি অ্যাপলের পরিচিত সমস্যাগুলিতে তালিকাভুক্ত নয় (আপাতদৃষ্টিতে নিরর্থক অঙ্গভঙ্গির জন্য আমি একটি রাডার খুলেছি) তবে এই সমাধানটি আমার পক্ষে নির্দোষভাবে কাজ করেছে।
স্কট কর্সক্যাডেন

ইচ্ছে করে আমি এই উত্তরটি আগে দেখেছি; আমি সম্প্রতি কিছু খনন না করা এবং অবশেষে আপনি এখানে যা করেছেন ঠিক তেমন প্রয়োগ না করা পর্যন্ত আমি সর্বোচ্চ ভোট দেওয়া উত্তরটি ব্যবহার করছিলাম :)
জ্যাক

কেন addObject:দু'বার বলা হয়?
জেসন মুর

5

দেখে মনে হচ্ছে আপনি যদি পিতামাতার সাথে সন্তানের সাথে সেট করে এবং তার চারপাশে অন্যভাবে না করেন তবে কোনও ক্র্যাশ না করে কাজ করে।

সুতরাং আপনি যদি:

[child setParent:parent]

পরিবর্তে

[parent setChildObects:child]

এটি কাজ করা উচিত, কমপক্ষে এটি আইওএস 7 এ কাজ করে এবং সম্পর্কের ক্ষেত্রে কোনও সমস্যা ছিল না।


1
উভয় পক্ষই বহু লোক থাকলে খুব বেশি ভাল কাজ করে না। তারপরে কোনও পরিষ্কার বাবা-সন্তানের সম্পর্ক নেই।
ফতুহোকু

3

আমার একই সমস্যা ছিল, তবে যখন আমি যা করছিলাম তার থেকে আলাদা কিছু চেষ্টা করেছি। আমি সাবআইটিমের কোডটি দেখতে পাচ্ছি না তবে আমি ধরে নেব যে এটির আইটেমের বিপরীত লিঙ্ক রয়েছে। যাকে এই শ্রদ্ধাযুক্ত লিঙ্কটিকে "প্যারেন্ট আইটেম" বলুন, তারপরে সবচেয়ে সহজ সমাধানটি হ'ল:

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;

প্রভাবটি এটি অ্যাপলের নিজস্ব কোড ব্যবহার করে এবং এটি সহজ এবং পরিষ্কার। এছাড়াও, সেটটি স্বয়ংক্রিয়ভাবে যুক্ত হয়ে যায় এবং সমস্ত পর্যবেক্ষক আপডেট হয়। সমস্যা নেই.


এই খুব সুন্দর. এটি পুরো সমস্যাটি সমাধান করে এবং পাশাপাশি রাখার আদেশ দেয়। তবুও উন্মাদ যে বাগটি এখনও উপস্থিত রয়েছে। এই উত্তরের আর একটি সুবিধা হ'ল আপনি যদি আপনার কোর-ডেটা মডেলগুলি পুনরায় জেনারেট করেন তবে আপনাকে আপনার বাগ ফিক্সগুলি আবার লিখতে হবে না। ধন্যবাদ!
জোহান এস

আমার অন্য উত্তর দেখুন। আমি আরও বিশদে বাগটি ট্র্যাক করেছি। এটি এখনও সহজতম উপায়, তবে অন্য পদ্ধতিটি সর্বোত্তম কারণ এটি আরও বেশি সম্ভাবনা খোলে।
ওপেন গডফ্রে

কি দারুন! অবশেষে !!! ধন্যবাদ! (আপনার অন্যান্য কোড ব্যবহার করে চেষ্টা করেছেন, তবে ত্রুটি পেয়েছেন, সেই ভুল প্রসঙ্গে কিছু পাঠানো হয়েছিল [স্ব-ড্যাড চেঞ্জ: এনএসকিভ্যালু চ্যাঞ্জইঞ্জার মানসমূহএটিআইডেক্সস: সূচিপত্রের জন্য: চিলড্রেনকে]])
লিওনার্ড

3

আমি কেবল এই ইস্যুটির জঘন্য হয়ে পড়েছি, এবং এখানে বর্ণিত অন্যদের তুলনায় এটি আরও সরল বাস্তবায়ন ব্যবহার করে সমাধান করেছি। আমি কেবল NSManagedObjectসাবক্ল্যাস ব্যবহার না করে সম্পর্কের সাথে আচরণ করার জন্য উপলব্ধ পদ্ধতিগুলি ব্যবহার করি make

কোনও 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সাবক্লাসে যাওয়ার আগে যা ব্যবহার করছিলাম ।


3

এক্সকোড 7 দিয়ে উদ্দেশ্যমূলক-সি থেকে সুইফ্ট 2 -তে একটি প্রকল্প স্থানান্তর করার সময় আমার কাছে এই সমস্যাটি দেখা দিয়েছে । এই প্রকল্পটি কাজ করত, এবং একটি ভাল কারণে: আমি এমওগেনেটর ব্যবহার করছিলাম যার এই বাগটি ঠিক করার জন্য প্রতিস্থাপন পদ্ধতি ছিল। তবে সমস্ত পদ্ধতির প্রতিস্থাপনের প্রয়োজন হয় না।

সুতরাং এখানে একটি উদাহরণ বর্গের সাথে সম্পূর্ণ সমাধানটি যথাসম্ভব ডিফল্ট অ্যাক্সেসরগুলির উপর নির্ভর করে।

ধরা যাক আমাদের অর্ডার করা আইটেম সহ একটি তালিকা আছে

আপনার এক / একাধিক সম্পর্ক থাকলে প্রথমে দ্রুত জয়ের বিষয়টি সর্বাধিক সহজ:

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

অবশ্যই আপনি যদি অবজেক্টিভ-সি ব্যবহার করেন তবে আপনি ঠিক একই জিনিসটি করতে পারেন যেহেতু এটিই আমি প্রথম স্থানে পেয়েছিলাম :)


3

আমি একমত যে এখানে একটি বাগ থাকতে পারে। আমি NSMutableOrriedSet এ সঠিকভাবে সংযোজন করতে অ্যাড অবজেক্ট> সেটারের প্রয়োগ পরিবর্তন করেছি।

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

সেটটিকে স্ব.সুবিটেমগুলিতে পুনঃসাইন করা নিশ্চিত করবে যে উইল / ডিড চেঞ্জভ্যালু বিজ্ঞপ্তিগুলি প্রেরণ হয়েছে।

লিল্ল, আপনি কি নিশ্চিত যে সেটে সঞ্চিত এনএসমেটেবলআর্ডারডসেট মানগুলি সেটআপ করার পরে কোরেডাটা সঠিকভাবে ডাটাবেসে সংরক্ষণ করবে? আমি এটি চেক করিনি, তবে দেখে মনে হচ্ছে যে কোরেডাটা এনএসআরআরডসেট সম্পর্কে কিছুই জানে না এবং এনএসএসেটকে অনেকগুলি সম্পর্কের ধারক হিসাবে প্রত্যাশা করে।


কোরেডাটা ফিরে আসার জন্য বা এনএসঅর্ডার্ডসেট অবজেক্ট নিতে, এই শুরু হওয়া প্রশ্নটি দেখানো হয়েছে বলে একাধিক শর্ত পূরণ করতে হবে। লোকেরা যখন আমার কোডটি ভাগ করে নেয় এমন বেশিরভাগ সাধারণ ভুলগুলি বিকাশকারী হয়ে থাকে সিংহ চালাচ্ছে না। এনএসআরার্ডসেটস ফ্রেমওয়ার্ক স্নোলেপার্ডে উপলভ্য নয়। তবে হ্যাঁ, আমি এটি ব্যর্থ হতে দেখিনি, যদিও আমি নিশ্চিত নই যে এটি পারফরম্যান্সে সেরা। আমি অনুমান করি যে এটি পুরো সেটটি নেবে এবং কেবলমাত্র পছন্দসই রেকর্ড সন্নিবেশ করার পরিবর্তে এটি প্রতিস্থাপন করবে।
ইনিজজোন

2

আমি মনে করি প্রত্যেকেই আসল সমস্যাটি অনুপস্থিত। এটা তোলে অ্যাকসেসর পদ্ধতিতে বরং সত্য যে নেই 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

দেখে মনে হচ্ছে ঠিক করাটি সেট অপারেটরগুলির বাস্তবায়ন পরিবর্তন করা যাতে তারা প্রকারগুলি স্বচ্ছভাবে পরিচালনা করে। কোনও -intersectsSet:অর্ডারযুক্ত বা আনর্ডারড সেট নিয়ে কোনও কাজ করার কারণ নেই ।

পরিবর্তনের বিজ্ঞপ্তিতে ব্যতিক্রম ঘটে। বিপরীত সম্পর্ক পরিচালনা করে এমন কোডটিতে সম্ভবত। যেহেতু এটি কেবল তখনই ঘটে যখন আমি একটি বিপরীত সম্পর্ক সেট করি।

নিম্নলিখিতটি আমার জন্য কৌশলটি করেছে

@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

2

আমি সবেগে সমস্যাটি পেয়েছি (এক্সকোড 6.1.1)।

উত্তরটি ছিল কোনও পদ্ধতি বা সংযোজনীয় বিষয়গুলি মেনে চলুন না আপনার এনএসম্যানেজডঅবজেক্ট সাবক্লাসগুলিতে বিষয়গুলি মেনে চলবেন না। আমি মনে করি এটি একটি সংকলক ভুল। খুব অদ্ভুত বাগ ..

আশা করি এটা সাহায্য করবে ..


3
সুতরাং, যদি আমি অন্যান্য সংশোধনগুলি বাস্তবায়ন করতে না পারি তবে এটি ঠিক করার জন্য আমার কী করা উচিত?
বেন লেগিগিরো

2

আমি এই সমস্যার সমাধানটি ইনভার্সকে নো ইনভার্সে সেট করে দিয়েছি, কেন জানি না, সম্ভবত অ্যাপল বাগ রয়েছে।এখানে চিত্র বর্ণনা লিখুন


1

"সাবাইটাইটস" এর পরিবর্তে "সিগন্যাল" নামক আইটেমটির সাথে আমার একই অবস্থা the টেমপেট সহ সমাধানটি আমার পরীক্ষায় কাজ করে। আরও, মুছে ফেলার সিগন্যালগুলি: পদ্ধতিতে আমার একটি সমস্যা ছিল। এই ওভাররাইডটি কাজ করছে বলে মনে হচ্ছে:

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

এটি করার আরও ভাল উপায় যদি থাকে তবে দয়া করে আমাকে জানান। আমার মানগুলির ইনপুটটি কখনই 10 -20 আইটেমের বেশি হয় না তাই পারফরম্যান্স খুব একটা উদ্বেগের বিষয় নয় - তবে দয়া করে প্রাসঙ্গিক কিছু উল্লেখ করুন।

ধন্যবাদ,

ডেমিয়েন


1

আমি এই প্রশ্নটি ত্রুটি বার্তার জন্য গুগল করে পেয়েছি এবং কেবল এটি চিহ্নিত করতে চেয়েছিলাম যে আমি এই ত্রুটিটি কিছুটা ভিন্ন উপায়ে চালিয়েছি (আদেশযুক্ত সেট ব্যবহার না করে)। এটি প্রদত্ত প্রশ্নের যথেষ্ট উত্তর নয়, তবে অনুসন্ধানের সময় অন্য যে কেউ এই প্রশ্নটিতে হোঁচট খায় তার পক্ষে যদি সহায়ক হয় তবে আমি এখানে এটি পোস্ট করছি।

আমি একটি নতুন মডেল সংস্করণ যুক্ত করছিলাম, এবং বিদ্যমান মডেলগুলির সাথে কিছু সম্পর্ক যুক্ত করেছি এবং আমি নিজে হেডার ফাইলটিতে অ্যাড * অবজেক্ট পদ্ধতিগুলি সংজ্ঞায়িত করেছি। আমি যখন তাদের কল করার চেষ্টা করলাম তখন আমি উপরে ত্রুটি পেয়েছি।

আমার মডেলগুলি পর্যালোচনা করার পরে, আমি বুঝতে পেরেছি যে আমি "টু-মেন রিলেশনশিপ" চেকবাক্সটি চেক করতে বোকামি করে ভুলে গেছি।

সুতরাং আপনি যদি এটির দিকে চলে যান এবং আপনি অর্ডার করা সেটগুলি ব্যবহার না করে থাকেন তবে আপনার মডেলটিকে ডাবল পরীক্ষা করে দেখুন।


1

আমি এই বাগের জন্য একটি স্থিতি পেয়েছি যা আমার পক্ষে কাজ করে। আমি শুধু এটি প্রতিস্থাপন:

[item addSubitemsObject:subItem];

এর সাথে:

item.subitemsObject = subItem;

1

সুইফটে সঠিক উত্তরের আরও ভাল সংস্করণ

var tempSet = NSMutableOrderedSet()
if parent!.subItems != nil {
    tempSet = NSMutableOrderedSet(orderedSet: parent!.subItems!)
}

tempSet.add(newItem)
parent!.subItems = tempSet

0

আমি LeeIII দ্বারা পদ্ধতিটি ব্যবহার করে কাজ করে দেখতে পেলাম, তবে প্রোফাইলে দেখা গেছে যে এটি অত্যন্ত ধীর ছিল। 1000 টি আইটেম পার্স করতে 15 সেকেন্ড সময় নিয়েছিল। সম্পর্কটি যুক্ত করার জন্য কোডটি মন্তব্য করা 15 সেকেন্ডকে 2 সেকেন্ডে পরিণত হয়েছিল।

আমার ওয়ার্কারআউন্ডে (যা দ্রুত তবে অনেক বেশি কুৎসিত) একটি অস্থায়ী মিউটটেবল অ্যারে তৈরি করা জড়িত থাকে তারপরে সমস্ত পার্সিং হয়ে গেলে অর্ডার সেটটিতে অনুলিপি করে । (আপনি যদি অনেক সম্পর্ক যুক্ত করতে চান তবে এটি কেবল পারফরম্যান্সের জয়)।

@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;
    }
}

আমি আশা করি এটি অন্য কাউকে সাহায্য করবে!


0

রবার্ট,

আমি সম্মতি জানাই আপনার উত্তরটি এর জন্য কার্যকর হবে তবে মনে রাখবেন যে ইতিমধ্যে একটি সম্পর্কের সাথে মানগুলির পুরো সেট যোগ করার জন্য একটি স্বয়ংক্রিয়ভাবে তৈরি পদ্ধতি রয়েছে। অ্যাপলের ডকুমেন্টেশন ( যেমন এখানে দেখা "সাথে অধিকের সম্পর্ক" বিভাগে অধীনে বা এখানে তাদের কার্যকরী এই ভাবে "কাস্টম সাথে অধিকের সম্পর্ক অ্যাকসেসর পদ্ধতি" ধারার অধীন):

- (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];
}

আপনি মূল ডেটার বাইরে আপনার সম্পর্কের সেটটি সহজেই সংকলন করতে পারেন এবং তারপরে এই পদ্ধতিটি ব্যবহার করে একবারে তাদের সমস্ত যোগ করতে পারেন। আপনার প্রস্তাবিত পদ্ধতির তুলনায় এটি কম কুৎসিত হতে পারে ;)


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.