1

サーバーからオブジェクトのリストをロードし、ObjectMapper を使用してそれらを Realm に保存します。各オブジェクトには、オブジェクトの画像をロードする場所を定義する URL が含まれています。毎回再読み込みする必要がないように、画像を読み込み、imagedata をレルム オブジェクトに保存します。残念ながら、データをリロードすると画像データが失われます。

私は主キーを使用していますが、JSON. ObjectMapper が Realm 内の既存のオブジェクトを更新せずに上書きしてしまうのではないかと心配しています。そのため、imagedata は nil であり、サーバーから再取得する必要があります。これを防ぐために私にできることはありますか?

これが私の簡略化された 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)
                }
            })
    }
4

1 に答える 1

1

オブジェクトをレルムに追加/アップサートする前に、主キーで既存の画像データをプルする必要があります。たとえば、ObjectMapper のマッピングを抽象化するメソッドでそれを行うことができますが、それでも Realm インスタンスを提供できます。

しかし、一般的に、その目的のために Realm 自体に画像を保存することはお勧めしません。いくつかの非常に優れた 画像 キャッシュフレームワークがあり、ディスクとメモリに画像をキャッシュできます。これらを使用すると、キャッシュをサイズ別に整理できるだけでなく、高速な解凍を支援し、有効期限を管理できます。

于 2016-02-29T14:43:31.253 に答える