2013-06-20 2 views
0

Я использую RestKit 0.20.2 в сочетании с MagicalRecord (важно для любых возможных контекстных проблем, о которых вы можете думать).RestKit два последовательных enqueueBatchOfObjectRequestOperations не напрямую сопоставлены с данными ядра

Мое приложение является экономным билетом (объектом) с товарами (объектом), и каждый предмет имеет налог (сущность). Моим вариантом использования является следующее: мне нужно синхронизировать основные данные с моим веб-сервером, когда ipad повторно подключается к Интернету после длительного периода времени, не имея возможности отправить данные (по любой причине)

Моя проблема заключается в том, чтобы иметь возможность синхронизировать большое количество объектов (он может перейти от 100 до 1000 даже больше), чтобы иметь возможность размещать большое количество объектов без перерывов я установил restkit параллелизм:

[RKObjectManager sharedManager].operationQueue.maxConcurrentOperationCount = 3; 

Теперь это работает абсолютно нормально. Но моя проблема в том, что у меня много избыточных сущностей, которые синхронизируются с каждым элементом. Например, у каждого товара есть налог, но у меня есть только два налога в моей модели, которые необходимо синхронизировать с веб-службой, а затем отправляются в качестве отношения к элементу (я только ставил идентификатор налога). Поэтому, чтобы обойти эту проблему для каждого postItem, я проверяю, имеет ли соответствующий налог идентификатор, если да, то я могу разобрать элемент напрямую с налоговыми отношениями в нем, если нет, мне нужно сначала синхронизировать налог, затем элемент с возвращенный налогID.

Работа вокруг работает так, как ожидалось. Но опять-таки возникает проблема, потому что между каждым postItem RestKit не сохраняется новый TaxID между двумя запросами, поэтому вместо отправки его один раз он отправляет его каждый раз, когда он встречает его внутри элемента, и когда все операции выполняются, он сохраняет вновь созданный taxIDs

Чтобы улучшить, что я выкопал немного в restkit и нашел

- (void)enqueueBatchOfObjectRequestOperations:(NSArray *)operations 
           progress:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progress 
           completion:(void (^)(NSArray *operations))completion 

Так что теперь я строй RKManagedObjectRequestOperations для моих налоговых структур и партии им. Затем я синхронизирую элементы. Это более эффективно, и мне не нужно, чтобы установить зависимость между операциями (потому что мне нужно, чтобы они были выполнены в определенном порядке, налог, то товар, то весь билет.)

ПРОБЛЕМЫ Между два enqueueBatchOperations, RestKit не отображает результат первой партии сразу, даже если я явно вызвать

[[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext saveToPersistentStore:&error] 

Это не отображается, потому что после первой партии налогов, я посылаю все детали, и я могу видеть, что taxID не установлены, но после того, как все партии выполнены, я могу ясно видеть, как они правильно отображаются в моем основном файле данных. Так я думал, что это был контекст вопрос, но когда я DIGG в RestKit и более конкретно в

appropriateObjectRequestOperationWithObject:(id)object 
              method:(RKRequestMethod)method 
              path:(NSString *)path 
             parameters:(NSDictionary *)parameters 

Я могу видеть линию 580:

NSManagedObjectContext *managedObjectContext = [object respondsToSelector:@selector(managedObjectContext)] ? [object managedObjectContext] : self.managedObjectStore.mainQueueManagedObjectContext; 

Это устанавливает mainQueueContext (а не объект контекста) для операций (я проверил с точками останова), поэтому вызов save или saveToPersistentStore должен распространять изменения из дочерних контекстов в mainQueue и ...это где я потерял надежду, и обратился к StackOverflow;)

ответ

0

Как это обычно бывает, я нашел решение после размещения на SO :)

Проблема заключалась в том, что RKManagedObjectRequestOperations где все создал до того restkit фактически отправил информацию. Таким образом, контекст был одинаков для всех запросов (как указано в методе соответствующегоObjectRequestOperationWithObject, и изменения не распространялись, поскольку ссылка на контекст была «старой» ссылкой.

Чтобы получить информацию о следующих запросах, я просто создайте RKManagedObjectRequestOperations в блоке завершения enqueueBatchOfOperations, и теперь все работает нормально с вновь созданным налоговым идентификатором;)

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