サーバーからオブジェクトのリストをロードし、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)
}
})
}