【问题标题】:how to initialise variables in @NSManaged object class as a JSON value?如何将@NSManaged 对象类中的变量初始化为 JSON 值?
【发布时间】: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(核心数据保存)。有几天我一直在为这样的例子而苦苦挣扎:(

标签: swift core-data swifty-json


【解决方案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
    }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 2018-08-15
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多