2013-10-02 5 views
2

Я занимаюсь этим после долгих исследований, но я действительно стараюсь найти лучшее решение моей проблемы.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, что я создал и вручную управлять этим сохранить к постоянному магазину.

Большое спасибо за ваше терпение и помощь.

ответ

0

В целом, ответ, на который вы ссылаетесь, по-прежнему действителен. RestKit не добавил специальной поддержки для сохранения контекста после завершения сопоставления (он все равно выполняется автоматически). Однако способ RestKit создает и управляет Core Data. Вы можете создавать свои объекты за пределами Core Data, а затем сопоставлять их в управляемые объекты, когда будете готовы к сохранению. Попытка вмешаться с установкой основных данных, созданной RestKit, скорее всего, вызовет проблемы в будущем (если не сразу), а сохранение двух разных постоянных хранилищ, скорее всего, будет более сложным, чем подготовка ваших данных за пределами Core Data, а затем импорт спасти.

+0

Итак, если мне нужно вручную сохранить в CoreData, совет должен использовать методы сопоставления «NSMutableDictionary» или «NSObjects» (как указано в ссылке), а затем сохранить в CoreData? В этом случае мне придется управлять «вручную» Отношениями, но если это правильный и быстрый способ, я приму свой ответ. – Danno

+0

Лично я бы пересмотрел, почему вы хотите сэкономить время, поскольку это увеличивает риск потери данных. Если вам нужно, то более быстрый (и более низкий риск) маршрут для разработки действительно должен отображаться в словаре/'NSObject', а затем преобразовываться в Core Data (классы модели Core Data могут иметь методы для облегчения этого). – Wain

+0

Если я не ошибаюсь, ResKit читает JSON из webService, карты в NSManagedObjects и сохраняет в coreData автоматически выполнение операции, например: обновление существующих записей, удаление записей, которые больше не представляют и вставляют новые. Если это правильно, моя проблема заключается в том, что JSON обновляется (на стороне сервера) в дифференциальном режиме и не возвращает все записи каждый раз: мне нужно выполнять эти операции «вручную» и выполнять сохранение данных ядра, когда все будет завершено. Пожалуйста, поправьте меня, если я скажу что-то не так. – Danno

Смежные вопросы