2013-07-23 12 views
5

Ho letto alcuni articoli su NSIncrementalStore e sono ancora confuso sull'intero concetto. In questo post possiamo leggere che:NSIncrementalStore - Utilizzo di dati locali e remoti

In sostanza è ora possibile creare una sottoclasse personalizzata di NSPersistentStore, in modo che al posto del tuo NSFetchRequest colpire un database locale SQLite , viene eseguito un metodo si definisce che può fare qualcosa di arbitrario per restituire risultati (come fare una richiesta di rete).

Fino a questo punto ho pensato che era NSIncrementalStore una soluzione perfetta per l'accesso ai dati remoti e risparmio/caching in locale. Ora, deduco che è una soluzione solo per l'accesso ai dati remoti.

Se ho ragione, sarò grato per qualsiasi consiglio su alcuni lavori. Se mi sbaglio, dov'è la magia e come implementarla? Ogni post/articolo/tutorial su NSIncrementalStore mostra con quanta facilità è possibile estrarre i dati dal server, ma nessuno di questi ha dato un solo indizio sulla memorizzazione nella cache delle cose per la visualizzazione offline.

Risposta, consideriamo uno scenario comune che un'applicazione dovrebbe scaricare alcuni dati da Internet, visualizzarli e salvarli localmente in modo che gli utenti possano utilizzare l'app offline.

Inoltre, non mi impegno a utilizzare NSIncrementalStore o qualcosa del genere. Sto solo cercando la soluzione migliore e questa classe è stata descritta da alcuni dei migliori esperti in questo campo.

risposta

0

Sono stato confuso anche per circa 4 o 5 ore :) così. La classe ereditata di NSPersistentStore è "rappresentazione" dell'archiviazione dati remota.

Quindi, per il l'accesso ai dati remoti e risparmio/caching in locale è necessario eseguire le seguenti operazioni

1) Creare sottoclasse di NSPersistentStore e la configurazione di esso.

Come quella:

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

dove coordinatore vostro principale NSPersistentStoreCoordinator

2) Quindi, è necessario altro NSPersistentStoreCoordinator, che "coordinerà rappresentanza locale (incrementalStore) e il contesto della memorizzazione esterno" e fornire la propria memoria di archiviazione locale (come l'URL del DB SQLite):

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

Ma non dimenticare che il tuo nuovo negozio persistente deve conoscere tutto lo precedente stato locale. Così opzioni dict sarà:

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

Quindi, secondo me, ho capito tutto il lavoro interno in questo modo:

Si richiede alcuni dati da API esterna. Analizzalo, quindi salva nel contesto del tuo backupPersistentStoreCoordinator, quindi unisci a quello principale.Quindi gli stati di tutti i contesti saranno uguali.

Tutto il testo precedente si basa sul lavoro con la soluzione alternativa AFIncrementalStore.

Il mio codice per implementare AFIncrementalStore con MagicalRecord:

- (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(); 
    } 
    } 

Se abbiamo bisogno di discutere il modo più semplice, è necessario solo sottoclasse NSIncrementalStore, messa a punto in modo corretto (come ho scritto), analizzare i dati, quindi creare un po ' contesto, salvare la data su di esso, quindi salvarlo e unirlo al contesto padre.

Quindi avrete 2 negozi e 2 contesti, e 1 StoreCoordinator.

Se ho fatto un errore da qualche parte, si prega di fare riferimento ad esso.

Inoltre, provare: https://gist.github.com/stevederico/5316737

+0

Ho già iniziato ad attuare il mio sottoclasse. Lo posterò presto come opensource, restate sintonizzati. : D – wczekalski

+1

E allora? Ottieni quello che vuoi? –

+0

Lo sto ancora facendo, ma finirò presto. Sarà disponibile sul mio github - github.com/wczekalski – wczekalski

Problemi correlati