Ich habe mehrere Eins-zu-viele Beziehungen in meinem Datenmodell. In jedem Fall ist es wichtig, dass die Reihenfolge der vom Modell abgerufenen Daten mit der Reihenfolge übereinstimmt, in der sie eingefügt wurde. Ich habe im Inspektor für jede Beziehung das Feld 'Geordnet' angekreuzt. Ich füge die Daten wie folgt:Core Data Relationship NSOrderedSet gibt unterschiedliche Reihenfolge auf jedem Gerät zurück
NSMutableOrderedSet *set = [destinationEntity mutableOrderedSetValueForKey:relationshipKey];
[set addObject:sourceEntity];
[CoreDataFunctions saveEntity:destinationEntity];
ich anschließend den Satz wie folgt abrufen:
NSOrderedSet *set = [sourceEntity valueForKey:relationshipKey];
auf dem Gerät, auf dem die Daten wurden hinzugefügt das funktioniert gut - ich mehrere Objekte hinzufügen und sie immer in der richtigen Reihenfolge anzeigen. Das Problem besteht darin, dass auf Geräten, die die Daten über die iCloud-Synchronisation erhalten haben, das Set in einer anderen Reihenfolge zurückgegeben wird. Immer die gleiche Reihenfolge beachten Sie, aber nicht die gleiche Reihenfolge wie auf dem ursprünglichen Gerät eingegeben.
Um dies zu umgehen, habe ich ein Attribut 'order' hinzugefügt, das beim Einfügen der Objekte in die Menge mit einer inkrementierenden Ganzzahl gefüllt wird. Ich kann dann den Satz nach dem Abrufen aus dem Datenmodell mit diesem Schlüssel sortieren. Ich kann jedoch nicht anders, als zu fühlen, dass etwas nicht stimmt, wenn das NSOrderedSet nicht in einer vorhersehbaren Reihenfolge zurückkommt.
Ich frage mich, ob dies mit einigen Fehlern im Protokoll verbunden ist, wenn ein Gerät Transaktionen von iCloud empfängt. Ich sehe die folgenden oft, vermutlich einmal für jede Transaktion:
*** ERROR: this process has called an NSArray-taking method, such as initWithArray:, and passed in an NSSet object. This is being worked-around for now, but will soon cause you grief.
Ich nehme an, das liegt daran, dass die Objekte im Datenmodell vom Typ NSSet sind, und Core Data sie etwas vergeht eine NSArray erwartet. Ich habe keine Ahnung, was ich dagegen tun kann oder ob es mit diesem Problem zusammenhängt. Ich nehme an, dass es ist, da ich vermute, dass Core Data das NSOrderedSet in ein NSArray konvertiert und dabei die Reihenfolge verliert. Ich kann das aber nicht bestätigen.
Alle Ratschläge dankbar erhalten!
Vielen Dank für Ihre schnelle Antwort. Nur ein paar Fragen.1. Würde dieser Ansatz die Verwendung von NSManagedObject-Unterklassen für meine Entitäten bedeuten? Ich verwende momentan Hilfsmethoden und KVC, damit ich mehr Kontrolle über die Einstellung von Werten und das Speichern habe. Z. B. habe ich eine Hilfsmethode, um den Schlüssel/Wert für eine Entität festzulegen und dann die Entität zu speichern. 2. Würde dieser Ansatz einen Unterschied machen, wenn ich Beziehungssets erhalte, ohne eine Abrufanforderung zu verwenden? Z. B. durch Zugreifen auf das Attribut, das den Satz direkt enthält. 3. Würde das Datum erstellt, wenn Entitäten schnell erstellt werden (d. H. Innerhalb von weniger als einer Sekunde)? – mashers
OK also 1) Nicht unbedingt alle deine Entitäten, aber der einfachste Weg wäre, deine 'BaseEntity' abzuleiten. Hinweis: Subclassing kann von Vorteil sein, da Sie die Typprüfung und IDE-Autokomplettierung erhalten und ärgerliche Fehler sparen. 2) Wenn Sie direkt auf das Attribut zugreifen, müssen Sie den zurückgegebenen Objekten einen 'sort descriptor' zuweisen. (Wenn Sie eine Unterklasse erstellen, können Sie dies in der Klasse selbst tun.) 3) Ja, solange sie in den 'NSManagedObjectContext' IN DER BESTELLUNG '' RE CREATED 'eingefügt werden. –
Danke @RASS, das war sehr hilfreich. Ich auch erkannte, dass meine Speicherungsstrategie sehr ineffizient war (im Grunde den Kontext jedes Mal speichern, wenn ein Attributwert geändert wurde ...) Ich habe jetzt eine zeitgesteuerte Speichermethode implementiert, die nur speichert, wenn Änderungen erkannt werden und nicht mehr als einmal pro 2 Sekunden implementieren Sie verwaltete Objektunterklassen in der Weise, die Sie beschrieben haben, da es wie eine sehr logische Lösung für das Problem scheint. Vielen Dank nochmal! – mashers