Swift 如何将@NSManaged对象类中的变量初始化为JSON值?

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

我想初始化'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 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(核心数据保存)。我为这样的例子奋斗了好几天:(请看