2016-08-20 2 views
0

Der Hintergrund für diese Frage ist, dass ich eine App habe, in der alle TableViews automatisch mit feinkörnigen Realm-Benachrichtigungen aktualisiert werden. Irgendwann hole ich Daten von einem Server, um eine Tabelle zu füllen. Im Abschlussblock des Serveraufrufs füge ich das neu abgerufene Objekt zu Realm hinzu und trigse eine Benachrichtigung aus, die die Tabelle aktualisiert.Force Realm Benachrichtigungsblock vor dem Fortfahren

Das Problem, das ich habe, ist, dass ich eine Animation starten möchte, die die neu eingefügte Tabellenzelle unmittelbar nach dem Hinzufügen des Objekts zu Realm verwendet. Gibt es eine Möglichkeit, den Benachrichtigungsblock zu erzwingen, bevor ich mit der nächsten Zeile fortfahre? Hier ist ein wenig Pseudo-Code zu versuchen zu klären

Network.getDataFromServer() { json in 
    let realmObject = Object(json) 
    realm.write({ 
     realm.add(realmObject) 
    }) 

    // Realm notification block needs to complete before getting here 
    runAnimation() 
} 

Hat jemand ein ähnliches Problem festgestellt? Ich mag es wirklich, feinkörnige Benachrichtigungen zu verwenden, um Tabellenansichten zu verwalten, weil sie so sauber sind. Daher würde ich gerne einen Weg finden, mit Szenarien wie diesem umzugehen.

+0

Jedes Mal, wenn Sie eine Schreiboperation im Realm ausführen, werden die Benachrichtigungen ausgelöst. Die einzige Sorge, die ich gerade habe, ist die Effizienz. Es ist besser, die Objekte mit Arrays zu dem Realm hinzuzufügen, als eine Schreibtransaktion für jedes einzelne Objekt, das Sie erstellen/aktualisieren, zu starten und zu committen. Ich würde es vorziehen, die 'addObjects()' -Funktion nur einmal zu verwenden, anstatt eine for-Schleife und die Funktion 'add()' bei jeder Iteration auszuführen. – Orlando

+0

Als ich Ihren Kommentar gelesen habe, wurde mir klar, dass mein Beispiel nicht sehr gut mit meinem Code übereinstimmt. Ich habe es tatsächlich so eingerichtet, wie du es beschrieben hast. Ein Aufruf wird ausgeführt, um alle Daten für die Tabelle abzurufen, sie wird in einer Schreibtransaktion in großen Mengen hinzugefügt, und die Animation wird tatsächlich für die TableView selbst ausgeführt, tut aber etwas mit tableView.cellAtIndexPath. – Erik

Antwort

1

Der richtige Weg, dies in einer vollständig reaktiven Anwendung zu tun wäre, die Animation basierend auf der eingehenden Benachrichtigung durchzuführen. Auf diese Weise, egal wie ein Objekt hinzugefügt wird (getDataFromServer, ein BG-Thread oder sogar ein anderes Prozess), würde Ihre App auf die gleiche Weise reagieren.

Dies führt zu einfacherem Code und ist gleichzeitig robuster.

Verwandte Themen