我在插入或更改对象时没有收到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时,通知确实有效。
答案 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)
})