363 Stimmen

Ausnahme, die in den von NSOrderedSet generierten Accessors ausgelöst wird

In meiner Lion-Anwendung habe ich dieses Datenmodell:

enter image description here

Die Beziehung subitems innerhalb Item ist bestellt .

Xcode 4.1 (Build 4B110) hat für mich die Datei Item.h , Item.m , SubItem.h y SubItem.h .

Hier ist der Inhalt (automatisch generiert) von 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

Und hier ist der (selbst erstellte) Inhalt von Item.m :

#import "Item.h"
#import "SubItem.h"

@implementation Item

@dynamic name;
@dynamic subitems;

@end

Wie Sie sehen können, ist die Klasse Item bietet eine Methode namens addSubitemsObject: . Leider, wenn Sie versuchen, es auf diese Weise zu verwenden:

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

SubItem *subItem = [NSEntityDescription insertNewObjectForEntityForName:@"SubItem" inManagedObjectContext:self.managedObjectContext];

[item addSubitemsObject:subItem];

dieser Fehler auftreten:

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

Können Sie mir helfen?

Aktualisierung:

Nach nur 1.787 Tagen seit meiner Fehlermeldung schrieb mir Apple heute (1. August 2016) Folgendes: "Bitte überprüfen Sie dieses Problem mit dem neuesten iOS 10 Beta-Build und aktualisieren Sie Ihren Fehlerbericht unter bugreport.apple.com mit Ihren Ergebnissen." . Hoffen wir, dass dies der richtige Zeitpunkt ist :)

1voto

Bimawa Punkte 3385

Ich habe eine Lösung für diesen Fehler gefunden, die bei mir funktioniert. Ich ersetze einfach dies:

[item addSubitemsObject:subItem];

damit:

item.subitemsObject = subItem;

1voto

Damien Del Russo Punkte 1030

Ich habe die gleiche Situation mit einem Element namens "Signale" anstelle von "Unterelemente". Die Lösung mit tempset funktioniert bei meinen Tests. Außerdem hatte ich ein Problem mit der Methode removeSignals:. Diese Überschreibung scheint zu funktionieren:

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

Wenn es einen besseren Weg gibt, dies zu tun, lassen Sie es mich bitte wissen. Meine Werteingabe ist nie mehr als 10-20 Elemente, so dass die Leistung ist nicht viel von einem Anliegen - trotzdem bitte darauf hinweisen, alles relevant.

Danke,

Damien

0voto

Robert Punkte 36330

Ich fand heraus, dass die Methode von LeeIII funktionierte, aber bei der Profilerstellung stellte ich fest, dass sie drastisch langsam war. Es dauerte 15 Sekunden, um 1000 Elemente zu parsen. Durch Auskommentieren des Codes zum Hinzufügen der Beziehung wurden aus 15 Sekunden 2 Sekunden.

Mein Workaround (der schneller, aber viel hässlicher ist) beinhaltet die Erstellung eines temporären veränderbaren Arrays und das anschließende Kopieren in den geordneten Satz, wenn alle ist das Parsing abgeschlossen. (Dies ist nur dann ein Leistungsgewinn, wenn Sie viele Beziehungen hinzufügen möchten).

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

Ich hoffe, das hilft noch jemandem!

0voto

an0 Punkte 16721

Ich bin mir ziemlich sicher, dass es endlich ist behoben in iOS 10 Beta 6 !

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X