Core Data указатели отладки iphone - PullRequest
1 голос
/ 11 февраля 2010

У меня довольно сложное приложение Core Data для iPhone. По большей части, это работает хорошо, но я сталкиваюсь со спорадической проблемой, которая проявляется в Core Data.

Я извлекаю данные из удаленной службы, указанная служба возвращает данные. Я анализирую данные и модифицирую различные управляемые объекты. Затем я сохраняю контекст управляемого объекта и получаю ошибку. В процессе распечатки ошибки я получаю следующее сообщение:
*** - [Длина UIImage]: нераспознанный селектор отправлен на экземпляр 0x8cd7aa0

Я могу выделить проблему до одного установщика в одном из моих управляемых объектов. Я сохраняю контекст управляемого объекта перед использованием параметра и сразу же сохраняю контекст управляемого объекта. Сбой происходит сразу после.

Это все делается в главном потоке. У меня более одного контекста управляемого объекта, но только одно постоянное хранилище.

Любые указатели для отладки такого рода проблем с базовыми данными приветствуются.

Ответы [ 2 ]

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

У меня была такая же проблема, поэтому я нашел обходной путь. Подкласс NSManagedObject и преобразование UIImage вручную путем переопределения методов доступа для свойства изображения.

  • В методе сеттера преобразуйте объект UIImage в экземпляр NSData, а затем установите свойство изображения управляемого объекта.
  • В методе получения преобразуйте данные свойства изображения и верните экземпляр UIImage.

Давайте приступим к работе:

В модели данных при нажатии атрибута «изображение» удалите текст Value Transformer Name . По умолчанию NSKeyedUnarchiveFromData , что вам и нужно.

Затем создайте подкласс сущности, щелкнув ее в модели данных, и нажмите Новый файл . Когда вы выберете сущность, вы увидите новый класс в Touch Classes класса какао под названием «Класс управляемых объектов». Нажмите Далее , оставьте местоположение файла как есть, снова нажав Далее , а затем поставьте галочку рядом со всеми объектами, которые вы хотите создать подклассом.

В файле реализации вашего подкласса NSManagedObject переопределите методы доступа свойства изображения, включив следующие два:

- (void)setImage:(UIImage *)image {
    [self willChangeValueForKey:@"image"];

    NSData *data = UIImagePNGRepresentation(image);
    [self setPrimitiveValue:data forKey:@"image"];
    [self didChangeValueForKey:@"image"];
}

- (UIImage *)image {
    [self willAccessValueForKey:@"image"];
    UIImage *image = [UIImage imageWithData:[self primitiveValueForKey:@"image"]];
    [self didAccessValueForKey:@"image"];
    return image;
}

Затем, всякий раз, когда вы устанавливаете изображение, используйте:

object.image = [UIImage imageNamed:@"icon.png"];

вместо:

[object setValue:[UIImage imageNamed:@"icon.png"] forKey:@"image"];

Всякий раз, когда вы получаете изображение, используйте:

UIImage *myImage = object.image;

вместо:

UIImage *myImage = [object valueForKey:@"image"];
0 голосов
/ 11 февраля 2010

Эта конкретная проблема была вызвана методом со словом «get», которое соответствует имени поля в управляемом объекте. Это, в свою очередь, скрывало реальную проблему, связанную с базой данных.

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