2016-02-29 2 views
1

Загрузите список объектов с моего сервера и сохраните их в Realm с помощью ObjectMapper. Каждый объект содержит URL-адрес, определяющий, где загрузить изображение для объекта. Я загружаю изображение и сохраняю imagedata в объекте realm, так что мне не нужно его перезагружать каждый раз. Но, к сожалению, данные изображения теряются, если я перезагружаю данные.Realm with ObjectMapper

Я использую первичный ключ, и я думал, что когда JSON. Я боюсь, что ObjectMapper не обновляет существующие объекты в Realm, но перезаписывает их. Таким образом, imagedata равен нулю и должен быть переназначен с сервера. Есть ли что-то, что я могу сделать, чтобы предотвратить это?

Вот мой упрощена 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) 
       } 
      }) 
    } 
+0

Можете ли вы поделиться каким-то кодом (где вы создаете объект и сохраняете его в царстве) – bcamur

+0

добавил код – netshark1000

ответ

1

Вы должны были бы тянуть существующие данные изображения по первичному ключу прежде чем добавлять/поднимать свой объект в Царство. Вы можете сделать это, например. в методе, который абстрагирует отображение ObjectMapper, но все же позволяет предоставить экземпляр Realm.

Но в целом я бы не рекомендовал хранить изображения в Царстве для этой цели. Есть некоторые реально существующие рамки, которые позволяют вам кэшировать изображения на диске и в памяти. Это позволяет вам помимо организации кеша по размеру, они помогают быстро декомпрессии и позволяют управлять временем истечения срока действия.

+0

Вот еще одна схема кэширования изображений с учебником: [Nuke] (http://www.raywenderlich.com/) 118361/что-это-ядерное оружие) – bcamur

Смежные вопросы