2010-12-27 9 views
4

Wenn ich ein neues Objekt in einen Core Data Managed-Objektkontext einfüge und kurz danach versuche, dieses neue Objekt im NSArrayController zu finden (das mit dem ManagedObjectContext durch Binding verbunden ist)), Ich kann es nicht finden. Ich mache die Erstellung und Suche in einer Methode.Neues Core Data-Objekt wird nicht in NSArrayController angezeigt. ArrangedObjects

Meine Frage jetzt. Wie lange dauert es, bis ein neues eingefügtes Objekt im Array arrangedObject von NSArrayControllers angezeigt wird?

Update: Hier ist der Code für das Einfügen und Abrufen der neuen Objekte

NSEntityDescription *entity = [[[self managedObjectModel] entitiesByName] objectForKey:@"EntityName"]; 
NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:[self managedObjectContext]]; 
... 
[[self managedObjectContext] processPendingChanges]; 

[arrayController fetch:nil]; 
NSArray* objects = [arrayController arrangedObjects]; //the new object is not present in the array 

Antwort

0

Nur eine Lösung dafür gefunden. Ich verwende die setSelectedObjects: Methode der NSArrayController, um das Objekt auszuwählen. Ich weiß nicht, warum ich diese Methode überhaupt nicht benutzt habe!

+0

Ich hatte ein ähnliches Problem, da ich die Anforderung zum Aufruf von -fetch: auf dem NSArrayController verpasst hatte.Ich bemerke, dass -setSelectedObjects: scheint dies als Nebeneffekt zu tun, aber für Gürtel und geschweifte Klammern habe ich gewählt, beide Methoden an den Controller zu senden. Letzteres ist nützlich, damit Bindungen in einem Editorblatt für die fraglichen verwalteten Objekte funktionieren würden, egal ob ein neues Objekt hinzugefügt wurde oder ein altes Objekt bearbeitet wurde, obwohl es sich anfühlt, als wäre es ein bisschen ein Hack und ein besserer Ansatz kann existieren. –

+0

Wie kann "setSelectedObjects" helfen oder funktionieren, wenn das Objekt noch nicht im Array ArrayController ist? –

3

Es ist nicht eine Frage des „wie lange“, sondern „an welchem ​​Punkt“. Es gibt genug Unterschiede, dass es wichtig ist, sie zu studieren. :-)

Normalerweise Array-Controller werden automatisch aktualisiert (holen Sie ihren Inhalt in diesem Fall) auf der nächsten Run-Loop aber technisch "bei einigen zukünftigen Lauf-Schleife". Wenn Sie möchten, dass sie sofort aktualisiert werden, nachdem Sie etwas eingefügt haben, senden Sie Ihrem MOC eine -processPendingChanges und fragen Sie dann den Array-Controller nach -fetch:.

Unter den ersten Dingen, die Sie in der Core Data documentation lesen, ist, dass es ein fortgeschrittenes Cocoa-Thema ist, dessen Voraussetzung Wissen Key Value Binding und Key Value Observing beinhaltet. Das fehlende Wissen, das Sie zu dieser Frage geführt hat, findet sich im Verständnis von KVC/KVO (und der Cocoa Bindings-Schicht).

+0

Der Aufruf der Methode processPendingChanges hat nicht funktioniert. Ich werde die KVC/KVO-Dokumentation durchlesen - vielleicht hilft mir das, das Problem zu verstehen. Thx – brutella

+0

Gut, dass nur die Einfügung "beendet" (oft nicht notwendig, aber nicht weh tut). Der Aufruf von -fetch: ist kritisch. Hast du das auch gemacht? Außerdem nehme ich an, dass Sie nur einen MOC haben. Wenn Sie den Aufruf von -fetch * aufrufen, müssen Sie möglicherweise Ihren Code posten (Einfügen + diesen erzwungenen Array-Controller-Abruf). –

+0

Ich habe das Code-Snippet im ursprünglichen Post hinzugefügt! – brutella