【问题标题】:How to work with retrieved Core Data Objects如何使用检索到的核心数据对象
【发布时间】:2020-07-11 22:17:09
【问题描述】:

当我使用 DataCore 存储数据时,有几个限制使我将大量检索到的对象转换为常规类对象,以便我可以定期处理数据。问题是这种行为会产生一些平庸的代码行。

我面临的限制是:

A.缺乏使用 Init() 使用构造函数创建对象的能力

B. 对属性的限制,特别是在属性更改时使用 didSet{}。

例如,您不能在此类中使用 didSet 或创建构造函数:

   extension Time {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Time> {
        return NSFetchRequest<Time>(entityName: "Time")
    }

    @NSManaged public var hours: Int
    @NSManaged public var minutes: Int
    
}

我应该如何克服这两个限制?

2.另外,到目前为止,我使用这种代码创建了一个 DataCore 实体对象:

let timeEntity = NSEntityDescription.entity(forEntityName: "Time", in: managedContext)!
    

let time = NSManagedObject(entity: timeEntity, insertInto: managedContext)
   time.setValue(10, forKeyPath: "hours")
   time.setValue(20, forKeyPath: "minutes")

这是在 Core Data 中创建实体的适当方式吗?

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    首先回答你的第二个问题,不。 TimeNSManagedObject 的子类。你可以使用

    let time = Time(context:managedContext)
    

    然后您可以访问您的time 实例的属性:

    time.hours = 10
    time.minutes = 20
    

    要回答您的第二个问题,我会质疑这是否有必要;也许您可以解释一下您要做什么。

    您可以使用包含hourminute 的计算属性来实现您正在寻找的相同目标。

    【讨论】:

    • 谢谢。我确实将代码生成设置为手动,这是它创建的我可以编辑的代码,也许这毕竟不是“手动”方式?您将如何将 didSet 与这些属性一起使用?我试过并得到“@NSManaged not allowed on observing properties”。使用计算属性时,我得到类似的结果:“@NSManaged not allowed on computed properties”。我希望能以我可以使用 didSet 或计算属性的方式提供基于这些属性的代码示例。
    • 您不能创建计算属性@NSManaged,但您可以使用计算属性来获取/设置实际属性。你能解释一下你想做什么吗?
    • 据我所知,我有一个“var dateComponents : DateComponents”属性,它不能被 NSManaged 管理。该属性需要在创建类对象时进行初始化。对于常规类,我使用构造函数来初始化 dateComponents 属性,并在任何其他属性发生更改时使用 didSet 更新 dateComponents 属性。
    • 好的。听起来您可以简单地通过扩展将该属性添加为计算属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多