Swift 如何将@NSManaged对象类中的变量初始化为JSON值?
我想初始化'Item'类中的变量,就像变量'Item2'类一样 这是“项”类:-Swift 如何将@NSManaged对象类中的变量初始化为JSON值?,swift,core-data,swifty-json,Swift,Core Data,Swifty Json,我想初始化'Item'类中的变量,就像变量'Item2'类一样 这是“项”类:- import UIKit import CoreData import SwiftyJSON class Item: NSManagedObject { @NSManaged var name = String() @NSManaged var symbol = String() @NSManaged var checked : Bool = false @NSManaged v
import UIKit
import CoreData
import SwiftyJSON
class Item: NSManagedObject {
@NSManaged var name = String()
@NSManaged var symbol = String()
@NSManaged var checked : Bool = false
@NSManaged var buyPrice = String()
@NSManaged var rank = String()
}
import Foundation
import SwiftyJSON
class Item2 : Codable {
var name = String()
var symbol = String()
var checked : Bool = false
var buyPrice = String()
var rank = String()
init(bitJSON: JSON) {
self.name = bitJSON["name"].stringValue
self.symbol = bitJSON["symbol"].stringValue
self.buyPrice = bitJSON["price_usd"].stringValue
self.rank = bitJSON["rank"].stringValue
}
}
这是“Item2”类:-
import UIKit
import CoreData
import SwiftyJSON
class Item: NSManagedObject {
@NSManaged var name = String()
@NSManaged var symbol = String()
@NSManaged var checked : Bool = false
@NSManaged var buyPrice = String()
@NSManaged var rank = String()
}
import Foundation
import SwiftyJSON
class Item2 : Codable {
var name = String()
var symbol = String()
var checked : Bool = false
var buyPrice = String()
var rank = String()
init(bitJSON: JSON) {
self.name = bitJSON["name"].stringValue
self.symbol = bitJSON["symbol"].stringValue
self.buyPrice = bitJSON["price_usd"].stringValue
self.rank = bitJSON["rank"].stringValue
}
}
ManagedObject不是普通对象。它们是评估数据库的面向对象方法。托管对象使用上下文获取其所有属性。managedObject必须有上下文——没有上下文,它们就无法工作
extension Item {
static func insert(json:JSON, in context:NSManagedObjectContext) -> Item{
let newItem = Item.init(entity: Item.entity(), insertInto:context)
newItem.name = json["name"].stringValue
newItem.symbol = json["symbol"].stringValue
newItem.buyPrice = json["price_usd"].stringValue
newItem.rank = json["rank"].stringValue
}
}
注意这个方法的两个方面:1)它不假设它知道上下文-这是一个更高级别的作业-对于某些应用程序,它只是直接插入viewContext,对于其他应用程序,会创建一个临时背景上下文。2)它不保存上下文-这也不是它的工作-其他对象可以同时编辑或创建,它们都应该以事务方式保存
例如,可以这样使用:
persistentContainer.performBackgroundTask { (context) in
let newItem = Item.insert(json: json, in: context)
do {
try context.save()
} catch {
// log to you analytic provider
}
}
希望这有帮助。
NSManagedObject
实例必须使用init
方法初始化,该方法将该项插入托管对象上下文中。基本上,可以使用Codable
和自定义初始值设定项在解码器的userInfo
字典中传递托管对象上下文。我将“Item”类设置为Codable,并从类“Item2”复制/粘贴init方法,但它说“@NSManaged property不能有初始值”,这也取决于关于核心数据模型的定义。但是您应该只声明@NSManaged
属性的类型,而不根据model@vadian,您是否有将该模型用作可编码模型的示例,我们可以将该模型用于coredata保存模型和json解析模型?我不想为代码数据实体和单独的模型对象创建自定义子类。我想为这两个都使用一(1)个模型类,它可以同时为codable和nsmanagedobject或任何东西创建子类。在我们的旧项目中,我们使用了两个模型。在转换之前,我们使用mapper方法将nsmanageobejct转换为nsobject(核心数据获取),并将nsobject转换为nsmanagedobejct(核心数据保存)。我为这样的例子奋斗了好几天:(请看