【问题标题】:Download data from JSON using ObjectMapper and Realm使用 ObjectMapper 和 Realm 从 JSON 下载数据
【发布时间】:2017-03-13 11:47:32
【问题描述】:

我是 swift 新手,我想使用一些库来从 JSON 下载和存储数据。我正在使用 ObjectMapper RealmAlamofire 来执行此操作。我可以使用AlamofireObjectMapper 下载数据,但是当我开始使用Realm 时,一切都出错了。问题是当我在模型中使用 Array 时效果很好,但是在我开始使用 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”,代码甚至不会进入循环。

【问题讨论】:

    标签: ios json realm


    【解决方案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"]
    }
    

    【讨论】:

    • 感谢您的回答。你能告诉我在哪里必须使用ignoredProperties() 方法吗?它应该与列表一起返回吗?
    • 无论如何,如果我使用它,我会收到这条消息:All properties must be primitives, NSString, NSDate, NSData, NSNumber, RLMArray, RLMLinkingObjects, or subclasses of RLMObject.
    • 你写的被忽略的属性函数。这是告诉 Realm 哪些属性不存储在 DB 中的函数。
    猜你喜欢
    • 2016-10-03
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多