Pro*_*ver 51
您可以将图像存储为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)
}
}
Run Code Online (Sandbox Code Playgroud)
规则很简单:如果图像尺寸较小,图像数量很少而且很少更改,您可以坚持将它们存储在数据库中.
如果有一堆图像,最好将它们直接写入文件系统,只需将图像的路径存储在数据库中.
以下是如何做到这一点:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
请注意:由于存在许多陷阱,因此两个代码示例都不是下载图像的可靠方法.在现实世界的应用程序/生产中,我建议使用用于此目的的库,如AFNetworking或AlamofireImage.
针对 Swift 2.2 更新了 ProblemSlover 的解决方案:
重要提示:唯一的变化是现在stringByAppendingPathComponent已从 Swift 2.1 中删除,因此您将收到一条错误消息:
stringByAppendingPathComponent 不可用:在 NSURL 上使用 URLByAppendingPathComponent 代替。
请记住,虽然它可能很烦人,但它已被删除是有原因的,您应该按照苹果的建议改用 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)
}
}
Run Code Online (Sandbox Code Playgroud)