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

Posted

技术标签:

【中文标题】如何将@NSManaged 对象类中的变量初始化为 JSON 值?【英文标题】:how to initialise variables in @NSManaged object class as a JSON value? 【发布时间】:2018-06-11 16:47:53 【问题描述】:

我想像变量“Item2”类一样初始化“Item”类中的变量

这是“项目”类:-

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()


这是“Item2”类:-

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
    


【问题讨论】:

NSManagedObject 实例必须使用 init 方法初始化,该方法将项目插入托管对象上下文中。基本上,Codable 和自定义初始化程序可以在解码器的 userInfo 字典中传递托管对象上下文。 我使“Item”类可编码并从“Item2”类复制/粘贴init方法,但它说“@NSManaged 属性不能有初始值” 这(也)取决于核心数据模型的定义。但是你应该只根据模型声明@NSManaged属性的类型而没有初始值 @vadian,您是否有将模型用作可编码模型的示例,我们可以将模型用于核心数据保存模型和 json 解析模型?我不想为代码数据实体和单独的模型对象创建自定义子类。我想为两者使用一 (1) 个模型类,它可以子类化可编码和 nsmanagedobject 或任何东西。在我们的旧项目中,我们使用了 2 个模型。在转换之前,我们使用 mapper 方法将 nsmanageobejct 转换为 nsobject(核心数据获取)和 nsobject 转换为 nsmanagedobejct(核心数据保存)。有几天我一直在为这样的例子而苦苦挣扎:( 请看***.com/questions/44450114/… 【参考方案1】:

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
    

希望这会有所帮助。

【讨论】:

以上是关于如何将@NSManaged 对象类中的变量初始化为 JSON 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Obj C中的另一个类中使用一个类中声明的变量

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值

静态成员变量初始化 C++

类的属性

存储的属性需要一个初始值或者应该是@NSManaged

继承与多态