NSManagedObjectContextObjectsDidChanged未被调用

时间:2016-02-11 00:30:12

标签: ios cocoa-touch core-data

我在插入或更改对象时没有收到NSManagedObjectContextObjectsDidChanged通知。上下文有父上下文,这可能是个问题吗?我在父上下文中收到通知没有问题。

这是我创建子上下文的方式:

func createPrivateContext() -> NSManagedObjectContext{
    let privateManagedObject = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
    privateManagedObject.parentContext = self.managedObjectContext
    privateManagedObject.mergePolicy = NSOverwriteMergePolicy
    return privateManagedObject
}

这是我将观察者添加到通知中心的方式:

self.privateMOC = appDelegate.createPrivateContext()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "objectsDidChanged:", name: NSManagedObjectContextObjectsDidChangeNotification, object: self.privateMOC!)

如何在子上下文中插入新对象:

let privateMoc = getPrivateMoc()
let newTask = Task.createNewTaskInManagedObjectContext(privateMoc)
try! privateMoc.obtainPermanentIDsForObjects([newTask])

预计会通知对象已插入,但我从未收到通知。

更新: 将子MOC从PrivateConcurrencyType更改为MainQueueConcurrencyType时,通知确实有效。

1 个答案:

答案 0 :(得分:0)

问题是被修改的对象所在的线程。如果使用PrivateConcurrencyType创建子上下文,则必须更改子上下文的perform块中的对象。

privateMOC?.performBlock({ () -> Void in
    let newTask = Task.createNewTaskInManagedObjectContext(privateMoc)
    print(newTask.objectID.URIRepresentation().absoluteString)
    try! privateMoc.obtainPermanentIDsForObjects([newTask])
    print(newTask.objectID.URIRepresentation().absoluteString)
})