Почему CoreData forceFetch требуется после удаления на iPad, а не на iPhone? - PullRequest
7 голосов
/ 18 мая 2010

Когда на iPhone запускается следующий код (ios 3.1), количество выбранных объектов после удаления на единицу меньше, чем до удаления. Но на iPad (ios 3.2) количество остается неизменным. Это несоответствие вызывало сбой на iPad, поскольку в другом месте кода вскоре после удаления вызывается fetchedObjects, и вызывающий код, доверяя счетчику, пытается получить доступ к свойствам только что удаленного объекта, что приводит к ошибке NSObjectInaccessibleException (см. Ниже ). Было исправлено использование этого закомментированного вызова для executeFetch, который при выполнении повторного вызова 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

Ответы [ 3 ]

6 голосов
/ 18 мая 2010

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

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

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

0 голосов
/ 16 сентября 2010

Добавление метода делегата не решило мою проблему. Но я решил эту проблему, добавив принудительное выполнение executeFetch после завершения удаления. Я также удаляю кеш перед выполнением выборки.

Я на iOS 4.1.

0 голосов
/ 13 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...