2013-07-23 9 views
5

Ich habe ein paar Artikel über NSIncrementalStore gelesen und bin immer noch verwirrt über das ganze Konzept. In diesem post können wir das lesen:NSIncrementalStore - Verwenden von lokalen und remote Daten

Im Wesentlichen jetzt eine benutzerdefinierte Unterklasse von NSPersistentStore erstellen können, so dass statt Ihrer NSFetchRequest eine lokale SQLite Datenbank schlagen, es läuft eine Methode definieren Sie, dass beliebige etwas tun kann , um Ergebnisse zurückzugeben (wie eine Netzwerkanforderung).

Bis zu diesem Punkt dachte ich, dass NSIncrementalStore Remote-Daten für den Zugriff und Speichern/Caching lokal eine perfekte Lösung. Jetzt folge ich, dass es eine Lösung nur für den Zugriff auf Remote-Daten ist.

Wenn ich recht habe, werde ich dankbar sein für einen Ratschlag bei einigen Workarounds. Wenn ich falsch liege, wo ist die Magie und wie kann ich sie umsetzen? Jeder Post/Artikel/Tutorial auf NSIncrementalStore zeigt, wie einfach es ist, Daten vom Server zu holen, aber keiner von ihnen hat einen einzigen Hinweis auf das Cachen von Dingen für die Offline-Betrachtung gegeben.

Beantworten, betrachten wir ein häufiges Szenario, dass eine App einige Daten aus dem Internet herunterladen, anzeigen und lokal speichern soll, damit Benutzer die App offline verwenden können.

Ich bin auch nicht verpflichtet, NSIncrementalStore oder etwas zu verwenden. Ich suche nur nach der besten Lösung und diese Klasse wurde von einigen der besten Experten in diesem Bereich beschrieben.

Antwort

0

Ich war auch für 4 oder 5 Stunden verwirrt :) So. Ihre geerbte Klasse von NSPersistentStore ist "Darstellung" Ihres Remote-Datenspeichers.

Also, für den entfernten Zugriff auf Daten und Speichern/Caching lokal benötigen Sie bitte den folgenden

1) tun erstellen Unterklasse von NSPersistentStore und es einzurichten.

wie folgt aus:

YOURIncrementalStore *incrementalStore = [coordinator addPersistentStoreWithType:[YOURIncrementalStore type] configuration:nil URL:nil options:nil error:&error];

wo Koordinator Haupt NSPersistentStoreCoordinator

2) Dann Sie andere NSPersistentStoreCoordinator müssen, dass "koordinieren lokale Vertretung (incrementalStore) und den Kontext des externen Speichers" wird und geben Sie Ihre lokale Speicherrepräsentation (wie SQLite DB URL) an:

[incrementalStore.backingPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]

Aber vergessen Sie nicht, dass Ihr neues persistentes Geschäft alle Ihre vorherigen lokalen Zustand kennen muss. So werden Optionen dict sein:

NSDictionary *options = @{ NSInferMappingModelAutomaticallyOption : @YES, NSMigratePersistentStoresAutomaticallyOption:@YES }

Also, imho, ich verstehe alle internen Arbeit auf diese Weise:

Sie fordern einige Daten aus externen API. Analysiere es, speichere es im Kontext deines backingPersistentStoreCoordinators und füge es dann zum Hauptteil hinzu.Die Zustände aller Kontexte sind also gleich.

Der gesamte vorherige Text basiert auf der Arbeit mit der Problemumgehung AFIncrementalStore.

Mein Code AFIncrementalStore mit MagicalRecord implementieren:

- (void)addMRAndAFIS { 
    [MagicalRecord setupCoreDataStack]; 

    NSURL *storeURL = [NSPersistentStore urlForStoreName:[MagicalRecord defaultStoreName]]; 
    NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator defaultStoreCoordinator]; 
    NSError *error = nil; 
    NSArray *arr = coordinator.persistentStores; 
    AFIncrementalStore *incrementalStore = (AFIncrementalStore*)[coordinator addPersistentStoreWithType:[PTIncrementalStore type] configuration:nil URL:nil options:nil error:&error]; 

    NSDictionary *options = @{ NSInferMappingModelAutomaticallyOption : @YES, 
         NSMigratePersistentStoresAutomaticallyOption:@YES }; 
    arr = coordinator.persistentStores; 
    if (![incrementalStore.backingPersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
    } 

Wenn wir die einfachste Art und Weise diskutieren müssen, müssen Sie nur NSIncrementalStore Unterklasse, Setup es richtig (wie ich schrieb), Daten analysieren, erstellen Sie dann einige Kontext, speichern Sie das Datum, speichern Sie es und fügen Sie es in den übergeordneten Kontext ein.

Sie haben also 2 Stores und 2 Kontexte und 1 StoreCoordinator.

Wenn ich irgendwo einen Fehler gemacht habe, bitte beachten Sie es.

Versuchen Sie auch,: https://gist.github.com/stevederico/5316737

+0

ich bereits angefangen habe meine eigene Unterklasse zu implementieren. Ich werde es bald als Open Source veröffentlichen, bleiben Sie dran. : D – wczekalski

+1

Also was? Hast du was du willst? –

+0

Ich mache es immer noch, aber ich werde bald fertig sein. Es wird auf meinem GitHub sein - github.com/wczekalski – wczekalski