NSManagedObjectContext objectWithID生命周期方法(派生属性)

时间:2014-02-10 21:08:10

标签: multithreading core-data nsmanagedobject nsmanagedobjectcontext

我有一个带有transient属性的NSManagedObject子类,它基本上是对一个持久多对多关系的重新格式化。我这样做是通过观察与KVO的关系并在-awakeFromFetch-awakeFromInsert等中注册观察者来实现的。

这一切都运行正常,但是如果我使用对象的objectID-objectWithID:技术在线程之间传递对象,则没有生命周期方法可以挂钩生成瞬态属性。事实上,没有一个生命周期方法被触发,因为直接使用id访问对象不被认为是一个提取,似乎。

有很多方法,但使用基于生命周期的技术会很好。我可能错过了什么吗?我可以使用另一种标准方法吗?

由于

编辑:示范项目 https://mega.co.nz/#!UsNBTZ7S!UU1qaFuc4W6Z2EYey-9AiMyfM8203Zfrm1lfpG5QITU

3 个答案:

答案 0 :(得分:0)

当你在一个带有上下文的线程上有一个NSManagedObject实例,然后从另一个线程和不同的上下文中检索它时,-awakeFromFetch-awakeFromInsert会触发。

您是否正确使用了上下文,以便检索新实例?

您是否查看了调试器中的指针以确保您正在与NSManagedObject的新实例进行通信?

根据我的经验,这些生命周期方法会根据上下文触发。

答案 1 :(得分:0)

好的,所以要回答我自己的问题,问题是因为objectWithID:总是返回一个对象,即使该对象没有在接收者管理对象上下文中注册。在某些情况下似乎objectRegisteredForID:提供更多信息。在任何情况下,结论都是生命周期方法 触发,但要注意objectWithID:,因为它可能导致不一致的对象。

答案 2 :(得分:0)

我遇到了同样的问题,并通过在NSManagedObjectContext上创建了一个扩展来解决了这个问题,该扩展通过正常的获取路径,因此触发了所有预期的生命周期方法:

extension NSManagedObjectContext {
    func fetchObject<T: NSManagedObject>(with objectID: NSManagedObjectID) -> T? {
        let request = T.fetchRequest()

        request.predicate = NSPredicate(format: "SELF = %@", objectID)
        guard let result = try? fetch(request) else {
            return nil
        }

        return result.first as? T
    }
}