Я нашел решение, которое сработало для меня (я не уверен, насколько оно применимо к вашей ситуации, но я добавляю его в качестве ответа, поскольку оно решило эту (или очень похожую) проблему для меня):
Пару дней назад я запустил пример RKTwitterCoreData
и заметил, что он отлично работает, в то время как мой, с очень простым кодом на тот момент и выполняющим почти то же самое, не работает. Я получил много невыполненных ошибок. Поэтому я решил изменить весь мой код, связанный с RestKit
, чтобы отразить, как это делает пример RKTwitterCoreData
.
Я разделю это на куски, чтобы попытаться помочь вам следовать моему образу мышления в то время (поскольку я не думаю, что наши проблемы идентичны).
Мое исходное предположение о реализации
Поскольку RestKit может возвращать объекты в Core Data, я предположил, что эти управляемые объекты можно использовать взаимозаменяемо. Например, я мог бы использовать объекты из Core Data точно так же, как объекты, полученные из удаленного веб-сервиса. Я мог бы даже объединить их, чтобы получить все данные.
Я был не прав
Я заметил, что код RKTwitterCoreData
действительно не работает таким образом в меньшей степени. Приличный кусок моего кода совпал с их кодом, но самым большим отличием было то, что они не рассматривали эти объекты как взаимозаменяемые. Фактически, они никогда не использовали объекты, полученные из удаленных хранилищ данных. Вместо этого они просто позволяют этому «провалиться сквозь щели». Я могу только предположить, что это означает, что они добавлены в хранилище данных Core Data, поскольку оно работает для них, а теперь и для меня.
Детали
Мое приложение работало после изменения моего кода, чтобы использовать этот поток. Я могу только тогда предположить, что наблюдаемые нами неисправимые ошибки связаны с использованием объектов с поддержкой базовых данных, которые мы возвращаем из веб-службы . Если вместо этого вы просто проигнорируете их, а затем сделаете выборку, вы получите все обратно (включая самый последний запрос), и у вас не должно быть никаких неисправимых ошибок.
Для уточнения, если вы посмотрите на RKTwitterViewController
, вы заметите, что строки 45-61 обрабатывают загрузку объектов:
- (void)loadObjectsFromDataStore {
[_statuses release];
NSFetchRequest* request = [RKTStatus fetchRequest];
NSSortDescriptor* descriptor = [NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:NO];
[request setSortDescriptors:[NSArray arrayWithObject:descriptor]];
_statuses = [[RKTStatus objectsWithFetchRequest:request] retain];
}
- (void)loadData {
// Load the object model via RestKit
RKObjectManager* objectManager = [RKObjectManager sharedManager];
[objectManager loadObjectsAtResourcePath:@"/status/user_timeline/RestKit" delegate:self block:^(RKObjectLoader* loader) {
// Twitter returns statuses as a naked array in JSON, so we instruct the loader
// to user the appropriate object mapping
loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[RKTStatus class]];
}];
}
Все выглядит нормально (по крайней мере по сравнению с тем, как я делал эту загрузку изначально). Но взгляните на метод делегата objectLoader:didLoadObjects:
:
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
[[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"LastUpdatedAt"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"Loaded statuses: %@", objects);
[self loadObjectsFromDataStore];
[_tableView reloadData];
}
Образец даже не касается параметра objects
! (Кроме NSLog
конечно ...)
Заключение / Т.Л.; др
Не используйте управляемые объекты, которые вы возвращаете в objectLoader:didLoadObjects:
, как если бы они полностью обеспечивались Базовыми данными. Вместо этого игнорируйте их и повторно извлекайте данные из Core Data. Все объекты, в том числе и из последнего запроса, находятся там. В противном случае вы получите неисправимые ошибки (по крайней мере, я).