CoreData (для iphone) хранения изображений - PullRequest
6 голосов
/ 25 января 2010

Интересно, мудрый ли выбор хранить изображения с основными данными в двоичном свойстве?

говорят, что у меня есть коллекция фильмов, и я хочу сохранить обложку DVD-диска в свойстве, средний размер обложки20 / 30kb (320x480px)

причина, по которой я хочу сделать это, для управления хранилищем, когда я удаляю фильм, я знаю, что изображение также удаляется

я просто не уверенесли это хорошая идея, загрузка данных, скорость?

у кого-нибудь есть опыт с этим?

Ответы [ 4 ]

11 голосов
/ 25 января 2010

Мне кажется, что хранение изображений в основных данных не очень хорошая идея, и я уверен, что я также прочитал это в одном из руководств по программированию Apple. Только учтите, что при получении вашей коллекции все изображения также будут загружены в память, даже если вы отображаете только 8 изображений, вся ваша коллекция изображений будет загружена основными данными.

Если вы хотите удостовериться, что удалили файлы изображений при удалении записи перемещения, я предлагаю вам прослушать уведомления от управляемогоObjectContext и удалить файлы при удалении фильма:

Вы можете зарегистрироваться для уведомления willSave или didSave, каждое из которых имеет свои преимущества / недостатки.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:managedObjectContext];

Получение удаленных объектов:

- (void) contextDidSave:(NSNotification *)notification
{
    NSDictionary *userInfo = [notification userInfo];
    for (NSManagedObject *currObject in [userInfo objectForKey:NSDeletedObjectsKey])
    {
         // Code for deleting file associated with the NSManagedObject, you can still
         // access the managed object's properties.
    }
}
7 голосов
/ 25 января 2010

Лучший способ - сохранить путь к изображению в управляемом объекте, а затем удалить файл в методе prepareForDeletion объекта.

1 голос
/ 25 января 2010

Мне пришло в голову, что вы можете использовать другой подход, который может быть лучше, если вы уже создаете подкласс NSManagedObject для вашей сущности фильма.

Вы можете реализовать метод didSave или willSave в NSManagedObject и проверить свойство isDeleted. Если оно удалено, удалите изображение с диска.

0 голосов
/ 21 ноября 2012

Смотрите мой ответ в:

Могу ли я получить доступ к файлам, используемым для внешнего двоичного хранилища в Core Data?

Теперь вы можете хранить большие файлы в Базовых данных, используя опцию «Разрешить внешнее хранилище». Единственная проблема с этим больше не имеет доступа к фактическим файлам по пути, только чистые двоичные данные. Я придумал «креативное» решение (насколько кто-нибудь догадывается, что это лучший опыт), но оно позволит вам использовать Core Data для управления вашими файлами, но при этом иметь доступ к файлам REAL по их пути.

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