【发布时间】:2020-09-08 19:45:52
【问题描述】:
我正在尝试将 JSON 保存到 CoreData,但 JSON 有点复杂,包含许多数组对象。我只能保存和显示简单的属性,如 String、Int... 但如果我添加具有可转换类型的属性,如 [Currency]、[Double],应用程序将崩溃。
您能告诉我正确的实现方法吗?
我的数据模型
struct Currency: Decodable {
let code, name, symbol: String?
}
struct Language : Decodable {
let name : String?
}
struct WorldData: Identifiable, Decodable {
var id : Int {
return population
}
var name : String?
...
var latlng : [Double]?
var currencies : [Currency]?
var languages : [Language]
...
}
我的手动 NSManagedObject 子类
extension CDCountry {
@nonobjc public class func fetchRequest() -> NSFetchRequest<CDCountry> {
return NSFetchRequest<CDCountry>(entityName: "CDCountry")
}
@NSManaged public var name: String?
@NSManaged public var latlng: NSObject?
@NSManaged public var currencies: NSObject?
@NSManaged public var languages: NSObject?
...
public var wrapperLatlng : NSObject {
latlng ?? ["Unknown error"] as NSObject
}
public var wrapperCurrencies : NSObject {
currencies ?? ["Unknown error"] as NSObject
}
...
以及我如何将加载的 JSOn 保存到 CoreData
static func loadDataToCD(moc: NSManagedObjectContext) {
loadDataFromJSON { (countries) in
DispatchQueue.main.async {
var tempCountries = [CDCountry]()
for country in countries {
let newCountry = CDCountry(context: moc)
...
newCountry.currencies = country.currencies as NSObject?
newCountry.languages = country.languages as NSObject
newCountry.latlng = country.latlng as NSObject?
newCountry.name = country.name
...
tempCountries.append(newCountry)
}
do {
try moc.save()
} catch let error {
print("Could not save to CD: ", error.localizedDescription)
}
}
【问题讨论】:
-
您使用的是
Codable,但可转换属性需要NSCoding。这些协议做类似的事情,但不兼容。Codable类型不能与可转换属性一起使用。 -
您对如何使其兼容有什么建议吗?谢谢@Tom Harrington