如何从IOS应用程序或Swift 2.2中的Realm数据库恢复映像?

时间:2016-10-05 11:57:24

标签: ios swift2 realm

我正在使用Swift 2.2编写iOS应用程序,我想在Realm数据库中本地保存帐户的个人资料图片。

我试过here,最后我有一个imageView,两个按钮。一个按钮用于保存图像,另一个按钮用于显示。在我的imageView中,我从图库中选择了图像并拍摄了NSData,并尝试将其存储在数据库中,但我无法检索它。请建议任何程序,以便我能够存储图像并显示它。

我的模特是

class ImageModel:Object{
   var photoData: NSData? = nil 
}

在我的Image课程中我做了

var imgData = NSData()

我的图片选择器控制器如下所示

  func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

        if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {

            imageView.contentMode = .ScaleAspectFit
            imageView.image = pickedImage

            let imageData = UIImagePNGRepresentation(pickedImage)!
            self.imgData = imageData
            //print(imgData,"\n")

        }

在我的保存按钮中

 let imgModel = ImageModel()

@IBAction func SaveImageToDB(sender: AnyObject) {

    imgModel.photoData = self.imgData
    print(imgModel.photoData)

    try! moreUses.sharedInstance().realm.write{
        try! moreUses.sharedInstance().realm.add(imgModel)
    }
}
@IBAction func ShowImageFromDB(sender: AnyObject) {
    let lists = moreUses.sharedInstance().realm.objects(ImageModel)
    print(lists)

    //let image : UIImage = UIImage(data: lists[0].photoData!)!
    //print(image)


}

我的realm对象的单例类是

class moreUses{

    var realm = try! Realm()

    static var mrUser: moreUses!

    class func sharedInstance() -> moreUses {
        if mrUser != nil {
            return self.mrUser
        }
        return moreUses();
    }

    init() {
    }
}

1 个答案:

答案 0 :(得分:1)

在回答之前,让我先说一下避免在Realm中保存像图像这样的大型数据对象的最佳做法。由于这些类型的数据已经可以很容易地保存为普通文件,因此将它们存储在Realm中并没有什么好处。只需要一个代表图像的领域.exe就好了,但你只需在磁盘上访问它。

如果您绝对必须将图像保存到Realm,那么您已经走在正确的轨道上了:

Object

要进一步检查您的代码:

  • 没有必要在单身人士中放置let image = UIImage() let imageData = UIImagePNGRepresentation(image) let realm = try! Realm() let imageObject = ImageObject() imageObject.data = imageData try! realm.write { try! realm.add(imageObject) } let queriedImageObject = realm.objects(ImageObject.self).first let retrievedImage = UIImage(data: queriedImageObject.data) 个实例。每次调用Realm时,它都会在该线程上重复使用相同的副本,因此没有性能命中。
  • 只要您将图像添加到数据库,就会引用Realm()的单个常量对象。如果您每次都要创建新副本,则每次都应创建ImageModel()的新实例,如果要保留,则应ImageModel()更新原始对象,具体取决于您的使用情况。只有一个(而不是每次都调用try! realm.write { }。)