使用ObjectMapper和Realm

时间:2017-03-13 11:47:33

标签: ios json realm

我是swift的新手,我想使用一些库来下载和存储来自JSON的数据。我正在使用ObjectMapper RealmAlamofire来执行此操作。我可以使用AlamofireObjectMapper下载数据,但当我开始使用Realm时,一切都出错了。问题是当我在我的模型中使用一个数组它工作正常,但在我开始使用Realm之后我不得不使用List而不是Array。

这是我的模特:

class ServiceItem: Object, Mappable {
dynamic var item: [Item]?
//var item = List<Item>()

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

func mapping(map: Map) {
    item <- map["Item"]
}
}

class Item: Object, Mappable {
    dynamic var id: String?
    dynamic var parentId: String?
    dynamic var userName: String?
    dynamic var userAddress: String?
    dynamic var userMegye: String?
    dynamic var userUtca: String?
    dynamic var userIrsz: String?
    dynamic var userKontakt: String?
    dynamic var userEmail: String?
    dynamic var userPhone: String?
    dynamic var userMobile: String?
    dynamic var userWeb: String?
    dynamic var userDesc: String?
    dynamic var userImage: String?
    dynamic var gpslat: String?
    dynamic var gpslong: String?

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

    // Mappable
    func mapping(map: Map) {
        id    <- map["id"]
        parentId         <- map["parent_id"]
        userName      <- map["user_name"]
        userAddress       <- map["user_address"]
        userMegye  <- map["user_megye"]
        userUtca  <- map["user_utca"]
        userIrsz     <- map["user_irsz"]
        userEmail  <- map["user_email"]
        userPhone     <- map["user_phone"]
        userMobile  <- map["user_mobile"]
        userWeb     <- map["user_web"]
        userDesc  <- map["user_desc"]
        userImage     <- map["user_image"]
        gpslat  <- map["gpslat"]
        gpslong     <- map["gpslong"]
        userKontakt    <- (map["user_kontakt"])
    }
}

这是我的下载和存储数据的功能:

func downLoadDataFromJSON() {

    let URL = "...."

    let item = Item()

    Alamofire.request(URL).responseObject { (response: DataResponse<ServiceItem>) in

        let serviceResponse = response.result.value

        let realm = try! Realm()

        if let allServices = serviceResponse?.item{
            for items in allServices {

                print(items.id!)
                print(items.userName!)
            }
        }

    }
}

不同之处在于当我使用“Array”时,“for”循环正在运行,我可以从JSON看到我的数据,但如果我使用“List”,代码甚至不会进入循环。

1 个答案:

答案 0 :(得分:1)

问题是,对于ObjectMapper,不能只转换为List类型,您需要自定义转换,例如this。但是我遇到了一些问题,因为Realm没有保存我的模型。

所以我选择使用以下方法:

在此处,您声明ObjectMapper的另一个变量可以工作但排除它以供Realm保存:

let backingItem = List<Item>()
var item: [Item] {
    get {
        return backingItem.map { $0 }
    }
    set {
        backingItem.removeAll()
        backingItem.append(objectsIn: newValue)
    }
}

然后

override public static func ignoredProperties() -> [String] {
    return ["item"]
}