Я пишу приложение iOS с помощью Swift 2, и я хотел бы сохранить изображение профиля в локальной базе данных в Realm. Я не могу найти никакой документации или людей, говорящих об этом.
Возможно ли это? И как?
Может быть, это плохо сделать?
Я пишу приложение iOS с помощью Swift 2, и я хотел бы сохранить изображение профиля в локальной базе данных в Realm. Я не могу найти никакой документации или людей, говорящих об этом.
Возможно ли это? И как?
Может быть, это плохо сделать?
Изображения можно хранить как NSData
. Если у вас есть URL-адрес изображения, который вы хотите сохранить локально, вот фрагмент кода, как это можно сделать.
class MyImageBlob {
var data: NSData?
}
// Working Example
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
var myblob = MyImageBlob()
myblob.data = imgData
let realm = try! Realm()
try! realm.write {
realm.add(myblob)
}
}
Правило прост: Если изображения невелики по размеру, количество изображений невелико, и они редко меняются, вы можете хранить их в базе данных.
Если есть изображения сгустка, вам лучше записывать их непосредственно в файловую систему и просто сохранять путь к изображению в базе данных.
Вот как это можно сделать:
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
// Storing image in documents folder (Swift 2.0+)
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let writePath = documentsPath?.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}
Обратите внимание: Оба образца кода не являются надежными методами для загрузки изображений, так как есть много ошибок. В реальных приложениях/в производстве я бы предложил использовать библиотеку, предназначенную для этой цели, например AFNetworking или AlamofireImage.
Решение проблемыSlover обновлено для Swift 2.2:
Важное примечание: единственное изменение в том, что теперь stringByAppendingPathComponent
был удален с Swift 2.1, поэтому вы получите сообщение об ошибке:
stringByAppendingPathComponent недоступен: вместо этого используйте URLByAppendingPathComponent в NSURL.
Пожалуйста, имейте в виду, что, хотя это может раздражать, оно было удалено по какой-либо причине, и вы должны следовать рекомендациям яблока, чтобы использовать NSURL. НО, если вы хотите продолжить это решение, исправление для Swift 2.1+ должно явно отображать documentsPath
в NSString
:
class MyImageStorage{
var imagePath: NSString?
}
let url = NSURL(string: "http://images.apple.com/v/home/cb/images/home_evergreen_hero_iphone_medium.jpg")!
if let imgData = NSData(contentsOfURL: url) {
//Explicitly cast to NSString
let documentsPath = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString)
let writePath = documentsPath.stringByAppendingPathComponent("myimage.jpg")
imgData.writeToFile(writePath, atomically: true)
var mystorage = MyImageStorage()
mystorage.imagePath = writePath
let realm = try! Realm()
try! realm.write {
realm.add(mystorage)
}
}