Я использую 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;)