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
Ho già iniziato ad attuare il mio sottoclasse. Lo posterò presto come opensource, restate sintonizzati. : D – wczekalski
E allora? Ottieni quello che vuoi? –
Lo sto ancora facendo, ma finirò presto. Sarà disponibile sul mio github - github.com/wczekalski – wczekalski