NSOrderedSet tərəfindən yaradılan istisna yaradılıb

Mənim Aslan ərizəmdə bu məlumat model var:

2019

355
12 сент. Dev 12 sep qurdu . 2011-09-12 11:59 '11 11:59 'da 2011-09-12 11:59
@ 24 cavab

Qurğanızı həm məlumat modeliniz, həm də fərqli adlarla öz versiyamla bərpa etdim. Hər iki halda eyni səhv aldım.

Apple-nin avtomatik olaraq yaradılmış kodunda bir səhv kimi görünür.

259
13 сент. Cavab TechZen Sep 13 2011-09-13 03:24 '11 at 3:24 2011-09-13 03:24

Mən bir səhv ola biləcəyini qəbul edirəm. NSMutableOrderedSet'i düzgün bir şəkildə əlavə etmək üçün əlavə obyektin tətbiq parametrini dəyişdim.

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

Set'i self.subitems-a göndərmək Will / DidChangeValue bildirişlərinin göndərilməsini təmin edir.

243
28 окт. Cavab 28 İyul tarixində verilir . 2011-10-28 01:03 '11 saat 01:03 'da 2011-10-28 01:03

Mən bütün lazımi üsulları həll edərək həlli yaxşılaşdırmağa qərar verdim:

 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]; } } 
111
04 марта '12 в 19:42 2012-03-04 19:42 cavab 04 mart 2012-ci il saat 19: 00-da Dmitri Makarenko tərəfindən verilir. 2012-03-04 19:42

Bəli, bu mütləq Core Data səhvidir. Bir müddət əvvəl ObjC-Runtime əsasında bir düzeltme yazdım, amma tezliklə tezliklə müəyyən ediləcəyinə qərar verdim. Hər halda, belə bir uğur yoxdur, mən onu GitHub-da KCOrderedAccessorFix kimi yerləşdirdim . Bütün şəxslərinizdə problemin üzərində çalışın:

 [managedObjectModel kc_generateOrderedSetAccessors]; 

Bir obyekt, xüsusilə:

 [managedObjectModel kc_generateOrderedSetAccessorsForEntity:entity]; 

Və ya yalnız bir əlaqələr üçün:

 [managedObjectModel kc_generateOrderedSetAccessorsForRelationship:relationship]; 
38
22 янв. Cavab Sterling Archer Jan 22 tərəfindən verilir 2013-01-22 10:05 '13 saat 10:05 'da 2013-01-22 10:05

Nusxa etmək əvəzinə, NSMutableOrderedSet əlaqələrinə daxil olmaq üçün NSObject-də istifadəçi vasitəsini istifadə etməyi təklif edirəm.

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

məsələn. İOS v5.0 əsas məlumatları üçün buraxılış qeydləri bunun üçün tətbiq olunur.

Qısa testdə mənim müraciətimdə çalışdı.

32
26 янв. Cavab Stephan tərəfindən 26 yanvarda verilir. 2012-01-26 10:18 '12 saat 10:18 'da 2012-01-26 10:18

Bir səhv izledi. Bu willChangeValueForKey:withSetMutation:usingObjects: olur willChangeValueForKey:withSetMutation:usingObjects:

Bu çağırış, izlənilməsi çətin ola biləcək bir xəbərdarlıq zənciri istehsal edir və əlbəttə ki, bir respondent üçün dəyişikliklər başqa bir nəticəyə gətirib çıxara bilər və mən Apple-in nə üçün bir şey etmədiyindən şübhələnirəm.

Lakin, Set-də bu normaldır və bu, yalnız OrderedSet-də tapşırıqların yerinə yetirilməsinə səbəb olur. Bu demək olar ki, yalnız dörd metod dəyişdirilməlidir. Buna görə, mənim etdiyim bütün işlər Set əməliyyatları onların bərabər sıra işlərinə çevrildi. Onlar böyük işləyirlər və minimal (lakin zəruri) üstünlük təşkil edirlər.

Kritik səviyyədə bu həll həqiqətən bir kritik çatışmamazlıqdan əziyyət çəkir; obyektlərə və mövcud obyektlərdən birinə əlavə olunarsa, ya əlavə edilmir, həm də sifariş verilənlərin sonuna köçürülür (onlardan hansılarını bilmirəm). Hər halda, obyektin gözlənilən indeks indeksi didChange zaman gözləniləndən fərqlənir. Bu, insanlar üçün bəzi tətbiqləri poza bilər, amma yeni mənbələri əlavə edirəm və ya onları əlavə etməzdən əvvəl son yerlərini təsdiqlədiyim kimi, bu, mənim üçün təsir göstərmir.

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

Əlbəttə, daha asan bir həll var. Belə görünür:

 - (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]; }]]; } 
17
29 сент. Owen Godfrey tərəfindən verilmiş cavab Sep 29 2013-09-29 03:22 '13 at 3:22 2013-09-29 03:22

Apple bir çox əlaqələrə dair sənədlər deyir: bir proxy mutasiya dəsti və ya sifarişli dəsti istifadə etmək lazımdır

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

Bu dəsti dəyişdirmək idarə olunan obyektinizə münasibətlər əlavə edir və ya aradan qaldırır. [] Və ya istifadə edərək aksesuarı istifadə edərək, bir dəyişənə sifariş verin. qeyd səhvdir və icra edilməyəcəkdir.

10
31 окт. 31 oktyabrda Nicolas Manzini tərəfindən verilmiş cavab . 2014-10-31 16:42 '14 16:42 2014-10-31 16:42

Eyni səhv var, @LeeIII həll mənim üçün çalışdı (thanks!). Bir az dəyişməyi təklif edirəm:

  • yeni metodun saxlanılması üçün obyektiv-c kateqoriyasından istifadə edin (buna görə maddənin yenidən yaradıldığı halda metoduzu itirməyəcəyik)
  • Mən artıq dəyişdirilə bilən dəsti olub olmadığını yoxlayın

Məzmun 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 
9
03 марта '12 в 20:51 2012-03-03 20:51 Cavab Danik 03.03.2012 20:51 tarixində verilir 2012-03-03 20:51

Bunun əvəzinə mogenerator istifadə edirsiniz

 [parentObject add<Child>sObject:childObject]; 

yalnız istifadə edin:

 [[parent object <child>sSet] addObject:childObject]; 
8
10 авг. cavab verildi Καρτχικ 10 aug. 2012-08-10 21:43 '12 at 21:43 2012-08-10 21:43

Şəxsən, sadəcə başqa bir @Stephan həllində təsvir etdiyimiz kimi, birbaşa üsul çağırışları ilə CoreData üsulları yaradılıb:

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

Bu, bir səhv təsbit edərkən Apple tərəfindən yaradılan kod haqqında qərara sonradan zidd ola biləcək kateqoriyalara olan ehtiyacları aradan qaldırır.

Bunu etmək üçün rəsmi bir yol olmağın əlavə faydası var!

7
04 июля '12 в 12:05 2012-07-04 12:05 Cavab Grouchal tərəfindən 04 iyul 12: 12-də verilir 2012-07-28 12:05

Göründüyü kimi, valideynləri uşağın bir uşağına bağladıqda, valideynləri uşağın üstünə qoyur və əksinə, o, uğursuz işləyir.

Belə ki, əgər işləsəniz:

 [child setParent:parent] 

əvəzinə

 [parent setChildObects:child] 

Bu iş ən azı iOS 7-də işləməlidir və bu münasibətlə heç bir problemi yoxdur.

5
02 февр. Cavab Cata 02 fevralda verilir. 2014-02-02 00:03 '14 'də 0:03 2014-02-02 00:03

Mən bu problemi atdım və burada təsvir olunanlardan daha sadə bir tətbiqlə həll etdim. NSManagedObject siniflər istifadə edilmədikdə əlaqələrlə işləmək üçün sadəcə NSManagedObject mövcud olan üsulları istifadə edirəm.

Bir NSOrderedSet əlaqəsinə bir obyektin daxil edilməsi üçün nümunə bir tətbiq bu kimi görünür:

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

Bu yaxşı işləyir və mən NSManagedObject alt siniflərinə köçmədən əvvəl istifadə etdiyim NSManagedObject .

3
16 окт. cavabı Mic Pringle tərəfindən 16 oktyabrda verilir . 2013-10-16 13:38 '13 at 13:38 2013-10-16 13:38

Mən bir səhv ola biləcəyini qəbul edirəm. NSMutableOrderedSet'e düzgün bir şəkildə əlavə etmək üçün bir obyektin> setter əlavə edilməsinin tətbiqini dəyişdim.

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

Set'i self.subitems-a göndərmək Will / DidChangeValue bildirişlərinin göndərilməsini təmin edir.

Leelll, əminəm ki, bu dəstdə saxlanılan NSMutableOrderedSet dəyərlərinin belə bir xüsusi qəbulu CoreData verilənlər bazasında düzgün saxlanacaq? Bunu yox etmədi, amma CoreData NSOrderedSet haqqında heç bir şey bilmir və NSSet link konteynerini çoxdan gözləyir.

3
11 янв. Cavab DisableR 11 jan verilir . 2012-01-11 08:11 '12 saat 08:11 'da 2012-01-11 08:11

Objective-C-dən Swift 2- ə Xcode 7 -dən bir layihə köçürdükdə bu problem yarandı. Bu layihə çalışdı və yaxşı bir səbəbdən: Mən bu səhvəni düzəltmək üçün əvəz üsulları olan MOGenerator istifadə etdim. Amma bütün üsullar dəyişdirilməsini tələb etmir.

Beləliklə, burada nümunəvi bir siniflə tamamlanmış bir həlldir və default accessors-dan ən çox istifadə edir.

Sifariş olunan maddələrlə bir siyahımız var deyək.

Birincisi, sürətli bir qələbə , bir-çox əlaqələriniz varsa, ən asan sadədir:

 item.list = list 

əvəzinə

 list.addItemsObject(item) 

İndi bu bir seçim deyilsə , burada nə edə bilərsiniz:

 // 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 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 

Əlbəttə ki, Objective-C istifadə etsəniz, eyni şeyi edə bilərsiniz, çünki burada mən bu ideyanı aldığım :)

3
11 нояб. Cavab Nycen 11 noyabrda verilir . 2015-11-11 13:31 '15 'də saat 13:31' de

Mənim də eyni problemim var idi, amma yalnız etdiyimdən fərqli bir şey sındığım zaman. SubItem üçün kodu görmürəm, ancaq maddəə geri istinad edirəm. Bu linkə zəng etmək üçün "parentItem" adını verin, sonra isə ən sadə həllər aşağıdakılardır:

 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; 

Effekt Apple'ın öz kodunu istifadə edir və sadə və təmizdir. Bundan əlavə, dəstə avtomatik olaraq əlavə edilir və bütün müşahidəçilər yenilənir. Problem yoxdur.

3
15 авг. Owen Godfrey tərəfindən verilmiş cavab 15 Avqust. 2012-08-15 07:54 '12 at 7:54 pm 2012-08-15 07:54

Yalnız Swift (Xcode 6.1.1) bir problem var.

Cavab NSManagedObject alt siniflərindəki hər hansı bir metod və ya əlavə əlavələrin kodunu vermədi. Hesab edirəm ki, bu, kompilyator səhvdir. Çox qəribə səhv.

Bu kömək edir.

2
05 дек. cavab verildi lobotart 05 dekabr . 2014-12-05 04:35 '14 at 4:35 pm 2014-12-05 04:35

Mən bu problemi Ters çevrilməklə həll etdim, niyə bilmirəm, Bəlkə Apple Bug var. 2019

20 июля '16 в 4:31 2016-07-20 04:31 Cavab LevinYan tərəfindən 20 İyul, '16 'da 4:31 ' də 2016-07-20 04:31 'də verildi

Hesab edirəm ki, hər kəsin problemi yoxdur. Bu, giriş metodları deyil, NSOrderedSet alt sinfi deyil NSSet . Buna görə, -interSectsSet: bir arqument kimi sifariş edilmiş bir dəstə ilə çağırılırsa, bu uğursuz olur.

 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 ilə işləmir *** -[NSSet intersectsSet:]: set argument is not an NSSet

Göründüyü kimi, düzəldilmiş bəyanatların həyata keçirilməsini şəffaf şəkildə idarə edə bilmək üçün dəyişməkdir. -interSectsSet: sifarişli və ya sıradan bir dəstə ilə işləməlidir.

Dəyişiklik bildirişində istisna olur. Güman edilir ki, geribildirməni işləyən kodda. Geri bildirim qurduğumdan bu baş verər.

Aşağıdakılar mənim üçün hiylə idi

 @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*);  + (void) fixMethodWithSetArgument:(SEL) aSel forClass:(Class) aClass {   unsigned int count,i; Method method = NULL; Method* methods = class_copyMethodList(aClass,  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
22 авг. Cavab verildi Entropy 22 Avqust 2014-08-22 19:02 '14 at 19:02 2014-08-22 19:02

Bu soruyu səhv mesajındakı linki tıklayaraq tapdım və yalnız bir az fərqli olaraq (sifariş edilmiş dəstləri istifadə etmədən) bu xətaya qaçdığımı göstərmək istəmişdim. Bu, bu sualın cavabı deyil, amma mən burda yerləşdirirəm ki, axtarış zamanı bu məsələ ilə üzləşən hər kəs üçün faydalı olarsa.

Modelin yeni bir versiyasını əlavə etdim və mövcud modellərlə əlaqələrim əlavə olundu və başlıq faylında * Object metodları əlavə etdim. Onları çağırmağa çalışdığımda yuxarıdakı səhvləri aldım.

Modellərimi gördükdən sonra mən "çox münasibətlər" qutusunu yoxa salmağı unutduğumu başa düşdüm.

Beləliklə, bu işləsəniz və sifarişli dəstləri istifadə etmirsinizsə, modelinizi iki dəfə yoxlayın.

1
17 мая '13 в 16:39 2013-05-17 16:39 Cavab BenV tərəfindən 17 May 'da 4:39' də verildi 2013-05-17 16:39

Mən eyni vəziyyətə "sub-elementlər" deyil, "siqnallar" adlanan bir element var. Tempset həlli testimdə işləyir. Ayrıca, removSignals: metodu ilə bir problemim var idi. Bu yalnış hərəkət işləyirdi:

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

Bunu etmək üçün daha yaxşı bir yol varsa, mənə bildirin. Mənim dəyərlərimin giriş dəyərləri 10-20 elementdən çox olmamalıdır, belə ki, performans çox narahatlıq doğurmur. Ancaq əhəmiyyətli bir şey göstərin.

Təşəkkür edirik

Damien

1
09 февр. Cavab Damien Del Russo tərəfindən verilir 09 fevral. 2012-02-09 20:37 '12 at 20:37 pm 2012-02-09 20:37

Mənim üçün çalışan bu səhv üçün bir düzeltme tapdım. Mən sadəcə əvəz edirəm:

 [item addSubitemsObject:subItem]; 

bu ilə:

 item.subitemsObject = subItem; 
1
13 мая '13 в 16:34 2013-05-13 16:34 cavab Bimawa 13 may, 2013 at 4:34 2013-05-13 16:34 verilir

Robert

Я согласен, что ваш ответ будет работать для этого, но имейте в виду, что существует автоматически созданный метод для добавления целого набора значений в отношения. Документация Apple ( как показано здесь в разделе "Отношения со многими" или здесь в разделе "Индивидуальные методы доступа к деталям" ) реализует их следующим образом:

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