CoreData: хранить изображения в БД или нет? - PullRequest
24 голосов
/ 04 апреля 2010

Я создаю приложение, которое берет фотографии с веб-сайта для какого-то имени пользователя и показывает его в формате UITable с именем пользователя, затем, щелкая имя пользователя, показывает фотографии этого пользователя, а затем нажимая на имя фотографии, показывает полноэкранное фото.

У меня вопрос: я использую NSData для получения фотографий из интернета. Нужно ли сохранять данные в CoreData? При нажатии на имя пользователя он создает NSData, загружает фотографии из интернета и показывает их в UITable. И это требует времени.

Что такое хороший подход? и как можно сохранить эти изображения в CoreData?

Я использую этот метод

NSData *imageData=[flickr dataForPhotoID:firstPhoto.id fromFarm:firstPhoto.farm 
onServer:firstPhoto.server withSecret:firstPhoto.secret inFormat: 
FlickrFetcherPhotoFormatSquare];

а вот определение метода dataForPhotoID

- (NSData *)dataForPhotoID:(NSString *)photoID fromFarm:(NSString *)farm   
   onServer:(NSString *)server withSecret:(NSString *)secret 
 inFormat:(FlickrFetcherPhotoFormat)format {

#if TEST_HIGH_NETWORK_LATENCY
sleep(1);
#endif

NSString *formatString;

switch (format) {
    case FlickrFetcherPhotoFormatSquare:    formatString = @"s"; break;
    case FlickrFetcherPhotoFormatLarge:     formatString = @"b"; break;
}

NSString *photoURLString = [NSString stringWithFormat:@"http://farm%@.static.flickr.com/%@/%@_%@_%@.jpg", farm, server, photoID, secret, formatString];
NSURL *url = [NSURL URLWithString:photoURLString];

return [NSData dataWithContentsOfURL:url];
}

Ответы [ 2 ]

55 голосов
/ 04 апреля 2010

Во-первых, всегда сохраняйте изображения в пригодном для использования формате, например PNG или JPEG, вместо NSData. Это избавит вас от многих головных болей.

Во-вторых, правило хранения двоичных данных:

  • <100kb хранить в той же таблице, что и соответствующие данные </li>
  • <1 Мб хранилище в отдельной таблице, прикрепленной через отношения, чтобы избежать ненужной загрузки </li>
  • 1 Мб хранилища на диске и ссылки на него внутри Core Data

Обновление

Хранилище внутри Core Data должно быть двоичным, и вы можете написать для него методы доступа. Взгляните на этот ответ: Основные изображения данных с рабочего стола на iphone

Обновление

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

1 голос
/ 08 апреля 2016

Вы можете просто хранить UIImage объекты непосредственно в CoreData, просто используйте Преобразуемый тип данных, и вы готовы к работе

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