2016-07-26 6 views
0

Ich versuche, die eingefügt/gelöschten Objekte nach einer Schreibtransaktion zu erfahren.Engmaschiges Benachrichtigungen alt/neu RLMResults

Mit dem feinkörnigen Benachrichtigungsblock kann ich:

/// The indices of objects in the previous version of the collection which have 
/// been removed from this one. 
@property (nonatomic, readonly) NSArray<NSNumber *> *deletions; 

/// The indices in the new version of the collection which were newly inserted. 
@property (nonatomic, readonly) NSArray<NSNumber *> *insertions; 

Meine Frage ist in diesem Code-Schnipsel:

RLMResults *contacts = [CYRLMAddressBookContact allObjects]; 
RLMNotificationToken *token = [contacts addNotificationBlock:^(RLMResults *_Nullable results, 
          RLMCollectionChange *_Nullable change, 
          NSError *_Nullable error) {}]; 

kann contacts eine "vorherige Version" der Sammlung in Betracht gezogen werden?

Wenn nicht ist es sicher, contacts in eine NSArray zu konvertieren, und das wäre eine "vorherige Version" der Sammlung?

Antwort

1

In diesem Codebeispiel, wenn die Meldeblock Feuer, contacts bereits im aktualisierten Zustand sein wird. Die deletions und insertions Werte werden in Bezug auf den aktualisierten Zustand sein, so dass alle UI-Elemente noch den vorherigen Zustand der einzelnen Elemente in contacts Anzeige kann passend aktualisiert werden. Keine

, ich glaube nicht, dass es nicht sicher ist, das zu tun. Wenn Sie die Inhalte von contacts auf ein NSArray kopiert, das wäre sicherlich die vorherige Bestellung von contacts vor der Benachrichtigung erfassen. Realm-Objekte sind jedoch aktiv. Wenn sich die Eigenschaftswerte in einem der Objekte contacts ändern, wird dies ebenfalls im Array angezeigt.

Das heißt, Sie müssen vorsichtig sein beim Kopieren von Objekten von RLMResults zu NSArray. Wenn Sie jedes Objekt direkt berühren, während Sie es an das Array übergeben, wird es von Realm lazy-geladen, was zu einem Leistungseinbruch führen kann.

+0

Danke @ Tim. Das war hilfreich. Was ich hier machen möchte, ist nicht auf die Benutzeroberfläche bezogen. Aber ich muss die eingefügten und gelöschten Objekte nach dem Update kennen. Kennen Sie einen besseren Weg, dies zu erreichen, ohne die Objekte in ein NSArray zu kopieren? In diesen Fällen konnte Realm die beiden Kopien der Ergebnismenge, die vorherige und die neue Version, übergeben. –

+0

Keine Probleme! Froh, dass ich helfen konnte! Ja wirklich? Im Moment konzentrieren wir uns auf die feinkörnige Benachrichtigungsfunktion hauptsächlich auf UI-basierten Änderungen. An welchem ​​Anwendungsfall arbeiten Sie dann? Wir würden uns freuen, davon zu hören! Im Moment tut es mir nicht leid. Ihre beste Wette wäre im Moment der NSArray-Ansatz. Es gab Diskussionen darüber, ob die "alten" Objekte auch im Benachrichtigungsblock zur Verfügung gestellt würden, aber derzeit wäre es schwierig und zeitaufwändig hinzuzufügen. – TiM

+0

Ich habe diese Antwort heute nur gesehen. Es tut uns leid. Ich folge Realm seit einiger Zeit. Ich verstehe deine Prioritäten. Ich habe versucht, feinkörnige Benachrichtigungen in einer Synchronisierungslösung zu nutzen. Wo würde ich Adressbuch Kontakte zu einer Tabelle in Bereich zu synchronisieren, und danach würde ich wissen, welche Kontakte hinzugefügt/gelöscht/aktualisiert wurden, so dass ich das zu unserem Remote-Server kommunizieren konnte. –