Вы можете увидеть, как RestKit делает это внутренне в классе RKManagedObjectResponseMapperOperation
.
Эта операция выполняется в три этапа.
Во-первых, нужно проанализировать строку JSON в NSDictionarys, NSArrays и т. Д. Это самая простая часть.
id parsedData = [RKMIMETypeSerialization objectFromData:data
MIMEType:RKMIMETypeJSON
error:error];
Далее вам нужно запустить операцию сопоставления, чтобы преобразовать эти данные в ваши NSManagedObjects. Это немного сложнее.
__block NSError *blockError = nil;
__block RKMappingResult *mappingResult = nil;
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
operationQueue.maxConcurrentOperationCount = 1;
[[RKObjectManager sharedManager].managedObjectStore.persistentStoreManagedObjectContext performBlockAndWait:^{
Не забудьте заменить этот словарь своими собственными сопоставлениями. Ключ [NSNull null]
отображает этот объект из корня.
NSDictionary *mappings = @{[NSNull null]: [jotOfflineRequestStatus mapping]};
RKMapperOperation *mapper = [[RKMapperOperation alloc] initWithRepresentation:parsedData
mappingsDictionary:mappings];
RKManagedObjectMappingOperationDataSource *dataSource = [[RKManagedObjectMappingOperationDataSource alloc]
initWithManagedObjectContext:[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext
cache:[RKManagedObjectStore defaultStore].managedObjectCache];
dataSource.operationQueue = operationQueue;
dataSource.parentOperation = mapper;
mapper.mappingOperationDataSource = dataSource;
[mapper start];
blockError = mapper.error;
mappingResult = mapper.mappingResult;
}];
Теперь вам нужно запустить задачи, которые были помещены в операцию Queue, которую мы создали. Именно на этом этапе устанавливаются соединения с существующими объектами NSManagedObject.
if ([operationQueue operationCount]) {
[operationQueue waitUntilAllOperationsAreFinished];
}