【问题标题】:Realm with ObjectMapper使用 ObjectMapper 的领域
【发布时间】:2016-06-12 08:39:46
【问题描述】:

我从我的服务器加载一个对象列表并使用 ObjectMapper 将它们保存到 Realm。每个对象都包含一个 url,该 url 定义了为对象加载图像的位置。我加载图像并将图像数据保存在领域对象中,这样我就不需要每次都重新加载它。但不幸的是,如果我重新加载数据,图像数据会丢失。

我使用主键,我的想法是当 JSON.我担心 ObjectMapper 不会更新 Realm 中的现有对象,而是会覆盖它们。所以图像数据为零,必须从服务器重新获取。我能做些什么来防止这种情况发生吗?

这是我简化的 ObjectMapping-File:

import Foundation
import ObjectMapper
import RealmSwift

class OverviewItem: PersistentObject {

    override var hashValue : Int {
        get {
            return self.overviewID.hashValue
        }
    }

    dynamic var overviewID: Int = 0
    dynamic var titleDe: String = ""
    dynamic var imageUrl: String = ""
    dynamic var imageData: NSData?

    required convenience init?(_ map: Map) {
        self.init()
    }

    //computed properties
    dynamic var image: UIImage? {
        get {
            return  self.imageData == nil ? nil : UIImage(data: self.imageData!)
        }
        set(newImage){
            if let newImage = newImage, data = UIImagePNGRepresentation(newImage){
                self.imageData = data
            }
            else{
                self.imageData = nil
            }
        }
    }

    //image is a computed property and should be ignored by realm
    override class func ignoredProperties() -> [String] {
        return ["image"]
    }

    override func mapping(map: Map) {
        overviewID <- map["infoid"]
        titleDe <- map["titleDe"]
        imageUrl <- map["imageurl"]
    }

    override class func primaryKey() -> String {
        return "overviewID"
    } 
}

这里是我如何获取图像和更新对象:

 func fetchImage(item: OverviewItem, successHandler: UIImage? ->(), errorHandler: (ErrorType?) -> ()){

        AlamofireManager.Configured
            .request(.GET, item.imageUrl)
            .responseData({ (response: Response<NSData, NSError>) in

                if let error = response.result.error{
                    logger.error("Error: \(error.localizedDescription)")
                    errorHandler(error)
                    return
                }

                if let imageData = response.result.value{

                    successHandler(UIImage(data: imageData))

                    let overviewID = item.overviewID  
                    let queue = NSOperationQueue()
                    let blockOperation = NSBlockOperation {

                        let writeRealm = try! Realm()
                        do{
                            if let itemForUpdate = writeRealm.objects(OverviewItem).filter("overviewID = \(overviewID)").first{
                                try writeRealm.write{
                                    itemForUpdate.imageData = imageData
                                    writeRealm.add(itemForUpdate, update: true)
                                }
                            }
                        }
                        catch let err as NSError {
                            logger.error("Error with realm: " + err.localizedDescription)
                        }  
                    }
                    queue.addOperation(blockOperation)
                }
            })
    }

【问题讨论】:

  • 你能分享一些代码(你创建对象并将其保存到领域)

标签: swift realm objectmapper


【解决方案1】:

在将对象添加/插入到领域之前,您需要通过主键提取现有图像数据。你可以这样做,例如在一个方法中,它抽象了 ObjectMapper 的映射,但仍然允许提供 Realm 实例。

但总的来说,我不建议为此目的将图像存储在 Realm 本身中。确实有一些 good image caching 框架,它们允许您在磁盘和内存中缓存图像。除了按大小组织缓存外,它们还可以帮助您快速解压缩,并允许您管理到期时间。

【讨论】:

  • 这里只是另一个带有教程的图像缓存框架:Nuke
猜你喜欢
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多