Arbeiten mit iCloud Core Data Integration

Die Synchronisierung von Anwendungsdaten auf Geräten ist eine komplexe und schwierige Aufgabe. Zum Glück hat Apple genau deshalb iCloud gebaut. In dieser Tuts + Premium-Serie erfahren Sie, wie iCloud funktioniert und wie Ihre Anwendungen Daten nahtlos auf mehreren Geräten gemeinsam nutzen können.


Auch in dieser Serie erhältlich:

  1. Arbeiten mit iCloud: Einführung
  2. Mit iCloud arbeiten: Schlüsselwertspeicherung
  3. Mit iCloud arbeiten: Dokumentenablage
  4. Arbeiten mit iCloud: Core Data Integration

In den vorherigen Versionen dieser Serie haben wir unsere Beispielanwendung überarbeitet, um von iCloud Key-Value Storage zu iCloud Document Storage zu wechseln. Der Dokumentenspeicher von iCloud ist wesentlich flexibler als der Schlüsselwertspeicher und daher für datenintensive Anwendungen besser geeignet. Core Data ist ein Persistenz-Framework für Anwendungen, die große Datenmengen und komplexe Datenmodelle verwalten. Im Laufe der Jahre hat sich Core Data einen Namen gemacht und gilt als zuverlässiger und flexibler Rahmen für die Datenpersistenz. Diese Serie wäre ohne die Besprechung von Core Data und dessen Integration mit iCloud nicht vollständig.


Kerndatenanwendungstypen

In Bezug auf Kerndaten gibt es zwei Arten von Anwendungen: (1) dokumentbasierte Anwendungen und (2) Bibliotheksanwendungen. Dokumentenbasierte Anwendungen, wie die Anwendung "Pages" von Apple, verwalten Dokumente, die durch einen Core Data Store gesichert werden. Bei Bibliotheksanwendungen wie der integrierten Musikanwendung des iPhones wird ein einziger beständiger Speicher verwendet, der in der gesamten Anwendung verwendet wird.

In diesem Lernprogramm werde ich beide Anwendungstypen besprechen und einen Überblick darüber geben, wie jeder Anwendungstyp in iCloud integriert werden kann. Core Data ist ein sehr breites Thema und einer der fortgeschritteneren Aspekte der Mac- und iOS-Entwicklung. In diesem Lernprogramm wird nur die Oberfläche des Möglichen und die Integrationsoptionen von iCloud verkratzt.


Dokumentbasierte Anwendungen

UIManagedDocument

UIManagedDocument ist eine konkrete Unterklasse von UID-Dokument und ist auf die Anforderungen von dokumentenbasierten Kerndatenanwendungen zugeschnitten. Für dokumentenbasierte Anwendungen, UIManagedDocument bietet das Beste aus zwei Welten (1) UID-DokumentBenutzerfreundlichkeit und (2) integrierte Unterstützung für Core Data. Es lohnt sich das zu erwähnen UIManagedDocument kann auch verwendet werden, wenn keine iCloud-Integration erforderlich ist. Obwohl UIManagedDocument wird häufig im Kontext von iCloud erwähnt. Es ist sinnvoll, sich einen Moment Zeit zu nehmen und die Vorteile von iCloud zu unterstreichen UIManagedDocument Klasse selbst.

Genau wie seine Oberklasse, UID-Dokument, UIManagedDocument macht das Dokumentenmanagement einfach und unkompliziert. Der entscheidende Unterschied zu UID-Dokument ist dass UIManagedDocument richtet sich speziell an Core Data. Beide UID-Dokument und UIManagedDocument habe viel aus der Box zu bieten. Erinnere dich an das vorherige Tutorial UID-Dokument Die Funktionen zum automatischen Speichern, Laden und Speichern werden in einer Warteschlange im Hintergrund ausgeführt, während die wesentlichen Details entfernt werden. Wenn Sie sich für die Verwendung von Core Data in einer dokumentenbasierten Anwendung entscheiden, wird die Verwendung von empfohlen UIManagedDocument Auch wenn iCloud nicht in der Funktionsliste Ihrer Anwendung enthalten ist.

Vor der Einführung von UIManagedDocument, Der Core Data Stack wurde traditionell im Anwendungsdelegierten eingerichtet und konfiguriert. Dies ist bei der Verwendung nicht mehr erforderlich UIManagedDocument. Eine der Feinheiten der UIManagedDocument Klasse ist der eingebaute Core Data Stack. Nach dem Initialisieren einer Instanz von UIManagedDocument, Ihnen steht ein vollständiger Core Data Stack zur Verfügung. UIManagedDocumentDie Schnittstelle des Benutzers stellt einen Kontext für verwaltete Objekte sowie den permanenten Speicherkoordinator und das Modell für verwaltete Objekte bereit. Das Konfigurieren des persistenten Speicherkoordinators ist so einfach wie das Bereitstellen eines Wörterbuchs mit Optionen, genau wie bei der manuellen Initialisierung eines persistenten Speicherkoordinators.

Wie der Name schon sagt, UIManagedDocument ist eine konkrete Unterklasse von UID-Dokument, was bedeutet, dass es so verwendet werden kann, ohne dass eine Unterklasse erforderlich ist UID-Dokument. Hinter den Kulissen, UIManagedDocument fasst automatisch verwaltete Objektmodelle zusammen, die in Ihrem Anwendungspaket gefunden werden, und bereitet einen Core Data-Stapel für die Arbeit vor. Wenn Ihre Anwendung komplexere Anforderungen hat, müssen Sie eine Unterklasse erstellen UIManagedDocument diese Anforderungen zu erfüllen.

Benutzerfreundlichkeit

Jeder, der mit Core Data vertraut ist, weiß, dass Änderungen in den permanenten Speicher übernommen werden, indem der Kontext des verwalteten Objekts gesendet wird sparen: Botschaft. Dies ist bei der Verwendung nicht mehr erforderlich UIManagedDocument. Dies ist nicht nur nicht notwendig, sondern sollte vermieden werden. Der Grund ist das unter der Haube, UIManagedDocument verwaltet einen privaten verwalteten Objektkontext. Dieser private verwaltete Objektkontext verwaltet einen untergeordneten verwalteten Objektkontext, den verwalteten Objektkontext, der durch freigegeben wird UIManagedDocumentöffentliche Schnittstelle. Senden Sie den untergeordneten verwalteten Objektkontext a sparen: In dieser Nachricht werden die Änderungen nur für den übergeordneten Kontext für verwaltete Objekte festgelegt und nicht für den permanenten Speicher, der vom übergeordneten Kontext für verwaltete Objekte verwaltet wird.

Kurz gesagt, Sie sollten das Vertraute verwenden UID-Dokument Methoden, um Änderungen im persistenten Speicher zu speichern, wird der Rest hinter den Kulissen erledigt. Es gibt einen Grund warum UIManagedDocument erbt von UID-Dokument!


Bibliotheksbasierte Anwendungen

Bibliotheksbasierte Anwendungen, z. B. die integrierten Musik- und Fotoanwendungen des iPhones, verwalten normalerweise einen Core Data-Stapel mit einem permanenten Speicherkoordinator und einem permanenten Speicher.


Unter der Haube

Sie fragen sich vielleicht, wie Core Data mit iCloud unter der Haube arbeitet. Dies hängt von der Art des Speichers ab, den Sie verwenden, dh (1) eine SQLite-Instanz oder (2) ein binärer (atomarer) Speicher. In den meisten Anwendungsfällen wird empfohlen, sich für SQLite zu entscheiden. Wenn Sie jedoch mit kleinen Datenmengen arbeiten, ist auch ein Binärspeicher eine Option. Nach Ansicht von iCloud besteht der größte Nachteil eines binären Speichers darin, dass bei jeder Änderung der gesamte Speicher ersetzt wird. Dies ist nicht nur ineffizient, sondern kann auch zu erheblichen Auswirkungen auf die Leistung führen, wenn das Geschäft an Größe gewinnt. Im weiteren Verlauf der Diskussion werde ich mich auf SQLite als Hintergrundspeicher konzentrieren.

Mit SQLite als Sicherungsspeicher ist der Hauptvorteil, dass Änderungen inkrementell weitergegeben werden, anstatt den gesamten Speicher durch jede festgeschriebene Änderung zu ersetzen. Um zu verstehen, wie Core Data und iCloud zusammenarbeiten, ist es wichtig zu wissen, dass die SQLite-Datenbank nicht in iCloud gespeichert ist. Stattdessen wird jede Änderung in sogenannten registriert Transaktionsprotokolle Diese Protokolle werden verwendet, um Änderungen geräteübergreifend zu verbreiten. Die Transaktionsprotokolle sind leicht und führen zu einem feinkörnigen, schnellen und effizienten Synchronisationsprozess. Die Transaktionsprotokolle werden in einem Verzeichnis im iCloud-Container gespeichert. Der genaue Ort kann durch Einstellen von festgelegt werden NSPersistentStoreUbiquitousContentURLKey Schlüssel im Optionswörterbuch an den persistenten Speicherkoordinator übergeben.

Ein weiterer wichtiger Aspekt der Synchronisierung ist die Aktualisierung der Benutzeroberfläche. Bei der Verwendung von Kerndaten kann dies durch Registrierung der entsprechenden Controller als Beobachter für erreicht werden NSPersistentStoreDidImportUbiquitousContentChangesNotification Benachrichtigungen, die gesendet werden, wenn eine Remote-Änderung propagiert wird. Basierend auf den Änderungen kann Ihre Anwendung die Benutzeroberfläche aktualisieren, um die an ihrem lokalen persistenten Speicher festgeschriebenen Änderungen widerzuspiegeln.


Zusammenführen

Ein weiterer wichtiger Vorteil von Core Data ist die genaue Kontrolle Ihrer Daten. Dies gilt insbesondere für das Zusammenführen von Daten, ein wesentlicher Bestandteil der Arbeit mit iCloud. Dank dieser Granularität, die nur dank der Verwendung von Transaktionsprotokollen möglich ist, erfolgt der größte Teil der Zusammenführung automatisch von Core Data.


Schlussgedanken

Der gemeinsame Faden in dieser Reihe war, wie Ihre Anwendungen von iCloud profitieren können und wie sie in iCloud integriert werden können. Ich möchte diese Serie beenden, indem ich einige Einschränkungen aufdeckt, auf die Sie achten sollten, wenn Sie einer Anwendung die iCloud-Unterstützung hinzufügen. In der zweiten und dritten Folge dieser Serie habe ich Ihnen die Verwendung gezeigt NSFileManager's URLForUbiquityContainerIdentifier: Methode, um einen Verweis auf einen bestimmten iCloud-Container zum Speichern von Daten in iCloud zu erhalten. In unseren Beispielen haben wir immer davon ausgegangen, dass iCloud auf den Geräten, mit denen wir gearbeitet haben, aktiviert war
Dies wird nicht immer der Fall sein. Daher ist es wichtig, eine Fallback-Lösung für Situationen zu haben, in denen iCloud nicht aktiviert ist. Im Folgenden sind zwei Beispiele aufgeführt, um diese Einschränkungen besser zu veranschaulichen.

Das erste Beispiel ist, wenn ein Benutzer kein iCloud-Konto hat oder sich noch nicht mit seinem iCloud-Konto auf dem Gerät angemeldet hat. Dies bedeutet, dass Ihre Anwendung nicht auf den iCloud-Container zugreifen kann, in dem Daten gespeichert werden sollen. Noch komplexer wird es, wenn Sie iCloud aktivieren, nachdem Sie Ihre Anwendung für einige Wochen verwendet haben. Der Benutzer erwartet, dass seine Daten auf ihren Geräten synchronisiert werden. Mit anderen Worten, Sie benötigen eine Möglichkeit, um die Daten von der Anwendungs-Sandbox in den iCloud-Container zu übertragen.

Das zweite Beispiel konzentriert sich auf die Datenpersistenz. Was passiert, wenn ein Benutzer iCloud auf seinem Gerät aktiviert hat, sich aber nach einigen Wochen dazu entscheidet, sich mit einem anderen iCloud-Konto anzumelden? Die im iCloud-Container gespeicherten Daten stehen dem Benutzer nicht mehr zur Verfügung, da ein anderes iCloud-Konto verwendet wird. Dies ist eine Sicherheitsmaßnahme von Apple. Daten sind mit einem iCloud-Konto verknüpft, nicht mit einem Gerät. Die Daten sind daher nicht verfügbar, wenn ein anderes iCloud-Konto verwendet wird. Es ist selten, dass ein Benutzer mehrere iCloud-Konten hat. Es ist jedoch wichtig, sich dieser Möglichkeit und der möglichen Konsequenzen bewusst zu sein.


Fazit

Ich hoffe, dass Ihnen diese Serie über iCloud eine gute Vorstellung davon vermittelt, was iCloud ist und was Sie als Entwickler für Sie tun können. Die Grundidee von iCloud ist einfach und die Einführung von iCloud ist relativ einfach, wenn das Datenmodell Ihrer Anwendung nicht zu komplex ist. Diese letzte Ausgabe hat jedoch gezeigt, dass die iCloud-Integration sehr komplex werden kann, wenn die Komplexität des Datenmodells Ihrer Anwendung zunimmt.