Я занимаюсь этим после долгих исследований, но я действительно стараюсь найти лучшее решение моей проблемы.ResKit: временный NSManagedObjects
Я совершенно новый как для resKit, так и для CoreData ... в любом случае я сопоставляю и сохраняю в CoreData JSON, который я получаю от веб-службы.
Вот некоторые код:
//ResKit and Core Data initialization here
...
//Initialization RKObjectManager
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://http://www.myWebService.com"]];
objectManager.managedObjectStore = managedObjectStore;
[RKObjectManager setSharedManager:objectManager];
//Categories Mapping and descriptor
RKEntityMapping *categoriesMapping = [RKEntityMapping mappingForEntityForName:@"XNCategory" inManagedObjectStore:managedObjectStore];
[categoriesMapping addAttributeMappingsFromDictionary:@{
@"id": @"idCategory",
@"desc": @"desc",
@"idFam":@"idFam"}];
categoriesMapping.identificationAttributes = @[ @"idCategory" ];
RKResponseDescriptor *categoriesDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:categoriesMapping
method:RKRequestMethodGET pathPattern:@"getData.asp" keyPath:@"categories"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
//Families Mapping and descriptor
RKEntityMapping *familiesMapping = [RKEntityMapping mappingForEntityForName:@"XNFamily" inManagedObjectStore:managedObjectStore];
[familiesMapping addAttributeMappingsFromDictionary:@{
@"id": @"idFam",
@"desc": @"desc"}];
familiesMapping.identificationAttributes = @[ @"idFam" ];
RKResponseDescriptor *familiesDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:familiesMapping
method:RKRequestMethodGET pathPattern:@"getData.asp" keyPath:@"families"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
//Relation between the 2 mapping
NSEntityDescription *categoryEntity = [NSEntityDescription entityForName:@"XNCategory"
inManagedObjectContext:[managedObjectStore mainQueueManagedObjectContext]];
NSRelationshipDescription *userRelationshipFrom = [categoryEntity relationshipsByName][@"family"];
RKConnectionDescription *connectionUserMessageFrom = [[RKConnectionDescription alloc]
initWithRelationship:userRelationshipFrom attributes:@{ @"idFam": @"idFam" }];
[categoriesMapping addConnection:connectionUserMessageFrom];
//Finally add the descriptor to the object manager
[objectManager addResponseDescriptor:categoriesDescriptor];
[objectManager addResponseDescriptor:familiesDescriptor];
В другом контроллере представления, когда мне нужно, чтобы загрузить все данные я просто сделать:
[[RKObjectManager sharedManager] getObjectsAtPath:@"getData.asp" parameters:@{kAuthKeyName : kAuthKeyValue} success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
//Success block
}failure:^(RKObjectRequestOperation *operation, NSError *error) {
//Failure Block
}];
Этот код правильно скачать и автоматически сохранить в постоянной памяти в CoreData сохраняет отношения между объектами.
Теперь мой вопрос: Есть ли способ избежать этого автоматического сохранения? Потому что мне нужно обрабатывать данные, полученные из webService, и сохранять их только тогда, когда я это решаю.
Я нашел это сообщение очень полезным или, по крайней мере, дал мне хороший вклад для начала исследования: Best practice for temporary objects in RestKit with Core Data, но это сообщение 2012 года, и я не знаю, что-то изменилось или если сейчас есть лучшее решение.
В orther словах, что мне нужно, это способ, который позволяет отображение с RESKIT так, все полученные данные, будут правильно отображаться сущность-уважая все NSRelationshipDescription, что я создал и вручную управлять этим сохранить к постоянному магазину.
Большое спасибо за ваше терпение и помощь.
Итак, если мне нужно вручную сохранить в CoreData, совет должен использовать методы сопоставления «NSMutableDictionary» или «NSObjects» (как указано в ссылке), а затем сохранить в CoreData? В этом случае мне придется управлять «вручную» Отношениями, но если это правильный и быстрый способ, я приму свой ответ. – Danno
Лично я бы пересмотрел, почему вы хотите сэкономить время, поскольку это увеличивает риск потери данных. Если вам нужно, то более быстрый (и более низкий риск) маршрут для разработки действительно должен отображаться в словаре/'NSObject', а затем преобразовываться в Core Data (классы модели Core Data могут иметь методы для облегчения этого). – Wain
Если я не ошибаюсь, ResKit читает JSON из webService, карты в NSManagedObjects и сохраняет в coreData автоматически выполнение операции, например: обновление существующих записей, удаление записей, которые больше не представляют и вставляют новые. Если это правильно, моя проблема заключается в том, что JSON обновляется (на стороне сервера) в дифференциальном режиме и не возвращает все записи каждый раз: мне нужно выполнять эти операции «вручную» и выполнять сохранение данных ядра, когда все будет завершено. Пожалуйста, поправьте меня, если я скажу что-то не так. – Danno