2016-03-31 3 views
2

Ich habe eine NSManagedObject mit einer childNodes Eigenschaft in seinem Modell. Jetzt möchte ich die childNodes Eigenschaft überschreiben und eine gefilterte Version davon zurückgeben, aber ich stürze immer wieder ab. Hier ist, was ich in meiner NSMO Unterklasse haben:Überschreiben Sie die Core Data to-many-Eigenschaft und geben Sie eine gefilterte Menge zurück

- (NSOrderedSet *)childNodes { 
    [self willAccessValueForKey:@“childNodes”]; 
    NSMutableOrderedSet *result = [self primitiveChildNodes]; 
    [self didAccessValueForKey:@"childNodes”]; 

    NSArray *filteredResult = [[result array] myCustomArrayFilteringMethod]; // let’s say this returns the first half of the array, as a contrived example 

    return [NSOrderedSet orderedSetWithArray:filteredResults]; 
} 

Diese Ordnung manchmal funktioniert, aber ich finde Abstürze wie: Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSOrderedSet objectsAtIndexes:]: index 24 in index set beyond bounds [0 .. 19]’ und ich bin mir nicht sicher, warum. Call-Stack scheint mutiert eine Sammlung verwandt zu sein, aber ich bin mutiert eine Kopie so bin ich nicht sicher, was passiert:

0 CoreFoundation   __exceptionPreprocess + 165 
1 libobjc.A.dylib  objc_exception_throw + 48 
2 CoreFoundation   -[NSOrderedSet objectsAtIndexes:] + 952 
3 Foundation    NSKeyValueWillChangeByOrderedToManyMutation + 568 
4 Foundation    NSKeyValueWillChange + 383 
5 Foundation    -[NSObject(NSKeyValueObserverNotification) willChange:valuesAtIndexes:forKey:] + 557 
6 CoreData    -[NSManagedObject(_NSInternalMethods) _excludeObject:fromPropertyWithKey:andIndex:] + 526 
7 CoreData    -[NSManagedObject(_NSInternalMethods) _maintainInverseRelationship:forProperty:oldDestination:newDestination:] + 254 
8 CoreData    -[NSManagedObject(_NSInternalMethods) _didChangeValue:forRelationship:named:withInverse:] + 567 
9 Foundation    NSKeyValueNotifyObserver + 347 
10 Foundation    NSKeyValueDidChange + 466 
11 Foundation    -[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:] + 118 
12 CoreData    -[NSManagedObject didChangeValueForKey:] + 135 
13 CoreData    -[NSManagedObject(_NSInternalMethods) _updateFromRefreshSnapshot:includingTransients:] + 758 
14 CoreData    -[NSManagedObjectContext(_NestedContextSupport) _copyChildObject:toParentObject:fromChildContext:] + 567 
15 CoreData    -[NSManagedObjectContext(_NestedContextSupport) _parentProcessSaveRequest:inContext:error:] + 1103 
16 CoreData    __82-[NSManagedObjectContext(_NestedContextSupport) executeRequest:withContext:error:]_block_invoke + 364 
17 CoreData    internalBlockToNSManagedObjectContextPerform + 84 
18 libdispatch.dylib  _dispatch_client_callout + 8 
19 libdispatch.dylib  _dispatch_barrier_sync_f_slow_invoke + 284 
20 libdispatch.dylib  _dispatch_client_callout + 8 
21 libdispatch.dylib  _dispatch_main_queue_callback_4CF + 1738 
22 CoreFoundation   __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 
23 CoreFoundation   __CFRunLoopRun + 2073 
24 CoreFoundation   CFRunLoopRunSpecific + 488 
25 GraphicsServices  GSEventRunModal + 161 
26 UIKit     UIApplicationMain + 171 
27 My app     main + 111 
28 libdyld.dylib 

Irgendwelche Vorschläge? Ich kann das nicht wirklich verstehen.

Antwort

0

Nur nicht. Fügen Sie eine andere Methode hinzu, die eine gefilterte Kopie der ursprünglichen Beziehung zurückgibt. Auch für die Implementierung iterieren Sie einfach die Sammlung und fügen Sie die Elemente hinzu, die Sie behalten möchten, kopieren und filtern Sie nicht.

Der Absturz ist darauf zurückzuführen, dass das Array, das Sie filtern, tatsächlich vom Datenspeicher unterstützt wird. Wenn Sie es filtern, wird der Inhalt des Filters geändert und die ursprüngliche Beziehung wird verwischt.

Verwandte Themen