La sincronizzazione di iCloud non invia dati tramite il contenitore ubiquity
Domanda
Utilizzo iCloud nelle mie app ormai da un po' e recentemente sto riscontrando un problema per cui i dispositivi si rifiutano di comunicare tra loro.O almeno questo è quello che pensavo finché non ho iniziato a registrare i metodi in cui avviene la fusione.Mio persistentStoreCoordinator
è impostato come descritto in a la mia domanda precedente.
Il problema è il seguente.Quando configuro il mio managedObjectContext
, aggiungo un osservatore per visualizzare la notifica NSPersistentStoreDidImportUbiquitousContentChangesNotification come segue:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChangesFrom_iCloud:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:coordinator];
Dove coordinator
è impostato come NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]
.
I miei metodi iCloud sono i seguenti:
- (void)mergeiCloudChanges:(NSNotification *)note forContext:(NSManagedObjectContext *)moc {
NSLog(@"insert %@", [[note userInfo] valueForKey:@"inserted"]);
NSLog(@"delete %@", [[note userInfo] valueForKey:@"deleted"]);
NSLog(@"update %@", [[note userInfo] valueForKey:@"updated"]);
[moc mergeChangesFromContextDidSaveNotification:note];
NSNotification *refreshNotification = [NSNotification notificationWithName:@"RefreshAllViews" object:self userInfo:[note userInfo]];
[[NSNotificationCenter defaultCenter] postNotification:refreshNotification];
}
- (void)mergeChangesFrom_iCloud:(NSNotification *)notification {
NSLog(@"merging changes");
NSManagedObjectContext *moc = [self managedObjectContext];
[moc performBlock:^{
[self mergeiCloudChanges:notification forContext:moc];
}];
}
Quindi ora abbiamo il problema vero e proprio
Inizialmente la sincronizzazione è avvenuta senza problemi.I dati di un dispositivo sono stati modificati, quindi la modifica è stata visualizzata sull'altro dispositivo.Ma adesso, niente.La parte curiosa è in quei registri che vedi mergeiCloudChanges:forContext:
.La fusione avviene effettivamente.Lo vedo innescato.Ma il insert
, delete
, E update
parti della nota di unione sono SEMPRE prive di contenuto.Quindi l'unione avviene, ma senza dati.Per quanto mi riguarda, non riesco a capire perché ciò accada o come sincronizzarlo nuovamente correttamente.Qualsiasi aiuto sarebbe più che apprezzato.
Nota:Sto anche usando il NSUbiquitousKeyValueStoreDidChangeExternallyNotification
notifica per il mio NSUbiquitousKeyValueStore
(che utilizzo per sincronizzare il file NSUserDefault
valori-chiave) e tali notifiche vengono trasferite e aggiornate senza alcun intoppo, il che mi confonde ancora di più sul motivo per cui persistentStoreCoordinator
le notifiche sono vuote.
Spero davvero che qualcuno lo abbia visto/sperimentato prima perché dopo aver esaurito per due settimane ogni strada a cui riesco a pensare per trovare e risolvere il problema da solo, sento di essere ora a un punto morto.
Soluzione
Ho capito questo.Fondamentalmente, i registri delle transazioni sembravano danneggiati o smarriti.Ho rielaborato un modo per risincronizzare i dispositivi e pubblicherò immediatamente i risultati su una mia domanda precedente