CoreData - нераспознанный селектор при извлечении сущностей по их ObjectID - PullRequest
3 голосов
/ 23 августа 2011

Я занимаюсь разработкой приложения, которое использует несколько потоков для выполнения интенсивных вычислений, а также для получения большого объема данных. Таким образом, я пытаюсь быть хорошим маленьким разработчиком и придерживаюсь правил Apple по параллелизму при разработке моего приложения с CoreData. По сути, у меня есть NSOperation, который запускает и получает данные. Он возвращает (методу в главном потоке) NSMutableSet, который содержит NSManagedObjectID для каждой возвращаемой сущности.

Вот метод в главном потоке, где я хочу снова преобразовать эти NSManagedObjectID s в фактические NSManagedObject подклассы:

-(void)updateLocalContextWithObjectIDs:(NSMutableSet *)idSet {

    NSMutableSet *entitySet = [[NSMutableSet alloc] init];

    for (NSManagedObjectID *objectID in idSet) {

        [entitySet addObject: (Person *)[[self.dataProvider sharedManagedObjectContext] objectWithID:objectID]];

    }

    self.entitySet = entitySet;
    [entitySet release];

}

Проблема, с которой я столкнулся, заключается в том, что я получаю следующую ошибку при запуске этого цикла:

-[Person persistentStore]: unrecognized selector sent to instance 0x619b270

Есть идеи, почему это происходит? Вызов persistentStore для объекта Person не выполняется мной - это должно происходить в CoreData, и я что-то не так делаю правильно.

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 23 августа 2011

Проблема заключалась в том, что я передавал набор NSManagedObject с вместо набора NSManagedObjectID с, как я должен был.

Это решено.

1 голос
/ 23 августа 2011

Как решить «нераспознанный селектор, отправленный на ошибку экземпляра 0xXXXX»

  1. Найдите, куда вы позвонили persistantStore в своем коде. Затем найдите, где вы перепродали этот объект.

  2. Если вы не можете определить, где находитесь, когда отпускаете объект, запустите Инструменты с включенными NSZombies

Explanition : Даже если ваш код не вызывает persistantStore на Person, ваш компьютер. Objective-C - это динамический язык, ваш компьютер имеет указатель на объект Person и отправляет persistantStore этому объекту. Это обычно случается, когда вы выпускаете что-то, чего не должны иметь. Объект исчез, и новый объект заменил его, однако указатель остается, поэтому, когда вы отправляете сообщение этому указателю, он переходит к объекту, который теперь занимает это место в памяти.

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