2015-06-05 4 views
3

В моем коде мне удалось сохранить textLabel с CoreData, но я не могу правильно сохранить изображение. Я прочитал несколько руководств, и я знаю, что мне нужно преобразовать их в NSData. Но как мне это сделать?Сохранение изображений в CoreData - Swift

Заранее благодарен!

ответ

5

Core Data не предназначена для сохранения больших двоичных файлов, таких как изображения. Вместо этого используйте Document Directory в файловой системе.

Вот пример кода для этого.

let documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String 
// self.fileName is whatever the filename that you need to append to base directory here. 
let path = documentsDirectory.stringByAppendingPathComponent(self.fileName) 
let success = data.writeToFile(path, atomically: true) 
if !success { // handle error } 

Рекомендуется сохранить filename часть в основных данных наряду с другими мета-данных, связанных с этим образом и извлекать из файловой системы каждый раз, когда вам это нужно.

Редакция:

Редактировать: также обратите внимание, что с ios8 и далее постоянный полный файл url недействителен, так как изолированный файл app-id генерируется динамически. При необходимости вам необходимо будет получить documentsDirectory.

0

Здесь вы идете JPEG и PNG вы просто использовать UIImagePNGRepresentation:

let image = UIImage(named: "YourImage") 
let imageData = NSData(data: UIImageJPEGRepresentation(image, 1.0)) 
managedObject?.setValue(imageData, forKey: "YourKey") 
+0

Значение сжатия 1.0 может быть очень дорогим по размеру. Также стоит учесть «UIImagePNGRпредставление». – zaph

+0

Я знаю это - он явно спрашивает, как его хранить, кроме того, что он должен прочитать о том, как использовать свойства и т. Д. Ваша оценка ниже также действительна @zaph. – Valentin

+1

Пожалуйста, учтите мой комментарий как дополнение, никоим образом не жалуясь на вопрос или не сводя к минимуму ответ. – zaph

0

Обычно крупные объекты данных не хранятся в базе данных или Core Data. Вместо этого сохраните изображения в каталоге документа (или подкаталоге) и сохраните имя файла в разделе «Основные данные».

Ответ от @Valentin о том, как создать представление данных изображения.

Сохранить это с func writeToFile(_ path: String, atomically atomically: Bool) -> Bool

+1

Как это сделать? –

+0

@zaph вы могли бы указать нам хороший учебник о том, как получить ссылку на изображение и для fetchRequest, как получить местоположение изображения? привет – alex

13

Вы не должны сохранять большие объемы данных в основных данных, инженер Apple, рассказал мне эту маленькую хитрость в последнем WWDC:

Вы можете использовать свойство «Позволяет внешнее запоминающее устройство»:

enter image description here

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

Чтобы сохранить изображение как NSData вы можете сделать:

let image = UIImage(named: "YourImage") 
let imageData = NSData(data: UIImageJPEGRepresentation(image, 1.0)) 
managedObject?.setValue(imageData, forKey: "YourKey") 

Помните, что 1,0 в UIImageJPEGRepresentatio означает, что вы используете самое лучшее качество и поэтому изображение будет большим и тяжелым:

Качество полученного изображения JPEG, выраженное как значение от 0,0 до 1.0. Значение 0.0 представляет максимальное сжатие (или самое низкое качество ), а значение 1.0 представляет наименьшее сжатие (или лучшее качество ).

+0

@zaph извините мою ошибку, вы правы. Я обновил его –

+0

С помощью «Разрешить внешнее хранилище» также установите тип атрибута в двоичные данные. Но из того, что я прочитал, что может быть устаревшим, есть минусы, включая миграцию и iCloud, поэтому будьте осторожны. – zaph

+0

и как читать это изображение, формируя основные данные и помещая их в ячейку tableview? – Igy

Смежные вопросы