如何把图像放在Realm数据库中?
我正在使用Swift 2编写一个iOS应用程序,我想在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) } }
可能这样做是一个坏主意?
规则很简单:如果图像很小,图像数量很less,很less更改,可以坚持将它们存储在数据库中。
如果有一堆图像,最好将它们直接写入文件系统,并将图像的path存储在数据库中。
这是如何做到的:
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) } }
请注意:这两个代码示例都不是用于下载图像的可靠方法,因为存在许多缺陷。 在现实世界的应用程序/生产中,我build议使用专门用于此目的的库,如AFNetworking或AlamofireImage 。
ProblemSlover的解决scheme更新了Swift 2.2:
重要说明:唯一的变化是,现在stringByAppendingPathComponent
已经从Swift 2.1中移除,所以你会得到一个错误:
stringByAppendingPathComponent不可用:改为在NSURL上使用URLByAppendingPathComponent。
请记住,虽然它可能是烦人的,它已被删除的原因,你应该遵循苹果的build议,而不是使用NSURL。 但是如果你想继续这个解决scheme,Swift 2.1+的修正是显式的将documentsPath
path转换为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) } }