Почему CoreData forceFetch требуется после удаления на iPad, но не iPhone?

Когда следующий код выполняется на iPhone (iOS 3.1) количество выбранных объектов после того, как удаление будет тем меньше, чем перед удалением. Но на iPad (iOS 3.2) количество остается тем же. Это несоответствие вызывало катастрофический отказ на iPad, потому что в другом месте в коде, вскоре после удаления, fetchedObjects называют и код вызова, доверяя количеству, доступу попыток к свойствам справедливого удаленного объекта, приводя к ошибке NSObjectInaccessibleException (см. ниже). Фиксация должна была использовать тот прокомментированный вызов для performFetch, который при выполнении выполняет второй вызов к урожаю fetchObjects тот же результат как на iPhone без него. Мой вопрос: Почему iPad приводит к различным результатам, чем iPhone? Это является вторым из этих различий, которые я обнаружил и недавно отправил.

-(NSError*)deleteObject:(NSManagedObject*)mo;
{
NSLog(@"\n\nNum objects in store before delete: %i\n\n",
      [[self.fetchedResultsController fetchedObjects] count]);

    [self.managedObjectContext deleteObject:mo];

    // Save the context.
    NSError *error = nil;
    if (![self.managedObjectContext save:&error]) {
    }

//  [self.fetchedResultsController performFetch:&error];  // force a fetch

NSLog(@"\n\nNum objects in store after delete (and save): %i\n\n", 
      [[self.fetchedResultsController fetchedObjects] count]);

    return error;
}

(Полный NSObjectInaccessibleException: "Завершая приложение из-за неперехваченного исключения 'NSObjectInaccessibleException', причина: 'CoreData не мог выполнить отказ для '0x1dcf90

7
задан animuson 4 January 2013 в 07:26
поделиться

2 ответа

Добавление следующего кода в делегат FRC решит эту проблему.

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { }

Спасибо BenT на форуме Apple Dev за ответ (см. Мои комментарии выше). Я попросил его объяснить исправление, и он сказал: «iPad использует iPhoneOS 3.2, а iPhone 3.1. В NSFetchedResultsController был внесен ряд улучшений в 3.2, но, к сожалению, это побочный эффект на требования делегатов к фактическому реализовать один (любой) из методов делегата для активного отслеживания изменений ". https://devforums.apple.com/message/221471#221471 (Надеюсь, это кому-то поможет. В FAQ сказано, что в таких случаях можно ответить на свой вопрос)

6
ответ дан 7 December 2019 в 09:57
поделиться

Помните, что fetchedresultscontroller кэширует данные для ускорения своей работы. После удаления объекта можно также вызвать + (void)deleteCacheWithName:, чтобы убедиться, что удаленный объект не задержится в кэше. То есть, если вы не используете вызовы делегатов.

0
ответ дан 7 December 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: