我是swift的新手,我想使用一些库来下载和存储来自JSON的数据。我正在使用ObjectMapper
Realm
和Alamofire
来执行此操作。我可以使用Alamofire
和ObjectMapper
下载数据,但当我开始使用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”,代码甚至不会进入循环。
答案 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"]
}