Я использую CoreData для локального хранилища и CloudKit для обработки облачной синхронизации. Я настроил подписки CloudKit для обнаружения удаленных изменений. Эти уведомления предоставляют CKRecord
, представляющий данные, которые были добавлены. Записи автоматически синхронизируются с хранилищем CoreData. Как я могу примирить CKRecord
с NSManagedObject
? Мне нужно иметь возможность взаимодействовать с ним так же, как я делаю сущности, извлеченные непосредственно из CoreData.
Вот кое-что, над чем я работал над кодом. Проблема в том, что поле recordName
, которое идентифицирует запись в CloudKit, не существует в хранилище CoreData, поэтому я получаю необработанное исключение. Но я не знаю, какое поле (если оно есть) будет соответствовать полю имени записи CloudKit.
//CKRecord+NSManagedObject
- (NSManagedObject*)managedObject {
NSPersistentCloudKitContainer *container = [CoreDataFunctions persistentContainer];
NSManagedObjectModel *managedObjectModel = container.managedObjectModel;
NSDictionary *entitiesByName = managedObjectModel.entitiesByName;
NSString *recordType = [self.recordType stringByReplacingOccurrencesOfString:@"CD_" withString:@""];
NSEntityDescription *entityDescription = [entitiesByName valueForKey:recordType];
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityDescription.name];
fetchRequest.fetchLimit = 1;
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"recordName == %@", self.recordID.recordName];
NSError *error = nil;
NSArray *results = [[CoreDataFunctions managedObjectContext] executeFetchRequest:fetchRequest error:&error];
NSManagedObject *managedObject;
if (error) {
NSLog(@"Error %@", error);
}
else {
if (results.count == 0) {
NSLog(@"No result");
}
else {
managedObject = results.firstObject;
NSLog(@"%@", managedObject.entity.propertiesByName);
}
}
return managedObject;
}