Это первый раз, когда я использовал новую версию RestKit и несколько MOC, поэтому они меня немного озадачили. Я использую RestKit 0.20-pre5 и добавляю управляемые объекты с помощью операций RestKit, а также вручную во всем приложении.
RestKits предоставляет два MOC для управления производительностью: контексты объекта mainQueue и PersistantStore. После проверки кода RestKits все новые управляемые объекты сохраняются в MOC mainQueue (на основе строки 433 RKObjectManager и проверки различных адресов указателей). Объекты, созданные RestKit, сохраняются нормально (конечно, после вызова сохранения), однако всякий раз, когда я создаю свои собственные ManagedObjects в том же MOC mainQueue и сохраняю его, они не сохраняются при перезапуске приложения. (Я сохраняю соответствующий MOC довольно часто)
Вот где появляется постоянное хранилище. Всякий раз, когда я сохраняю постоянное хранилище вместе с MOC mainQueue, данные сохраняются. Я предполагаю, что это как-то связано с изменениями слияния RKManagedObjectStore всякий раз, когда я вызываю сохранение в persistantStoreMOC (через уведомление). Итак... все хорошо, верно?
Проблема в том, что всякий раз, когда я сохраняю оба контекста, возникает заметная задержка, которая длится не менее 1 секунды (может варьироваться до 3!). Это отставание, кажется, увеличивается по мере того, как я создаю больше NSManagedObjects. Я запускал инструменты, и проблем с памятью нет. Должно быть, я неправильно использую реализацию основных данных RestKits.
Для записи я сохраняю, используя следующий метод:
- (void)saveContext
{
__block BOOL _blockSuccess;
__block NSError *_blockError;
NSManagedObjectContext *persistantContext = [[[RKObjectManager sharedManager] managedObjectStore] persistentStoreManagedObjectContext];
[globalManagedObjectContext performBlockAndWait:^{
_blockSuccess = [globalManagedObjectContext save:&_blockError];
}];
if (! _blockSuccess) NSLog(@"Failed to save context: %@", _blockError);
[persistantContext performBlock:^{
_blockSuccess = [persistantContext save:&_blockError];
if (! _blockSuccess) NSLog(@"Failed to save context: %@", _blockError);
}];
}
Это вызывается из одноэлементного объекта всякий раз, когда мы хотим сохранить состояние приложения. (globalManagedObjectContext — это просто макрос, указывающий на RestKits mainQueueObjectContext). Удаление сохранения persistantContext устраняет задержку, но, конечно, не сохраняет данные.
Любая помощь (особенно Блейк Уоттерс;) будет принята с благодарностью!
Ваше здоровье,
Арон