我正在通过App Group在iPhone目标和Watch的目标之间建立一个共享Core Data上下文的Apple Watch应用程序。下面的WatchCoreDataProxy
是处理核心数据函数的定制框架,指的是App Group作为两个目标之间的桥梁。我更新iPhone应用程序中的上下文并保存,然后将Darwin通知发送到Watch,它从相同的上下文中获取更新的NSManagedObjects。除了一个怪癖大多数一切运作良好:NSManagedObject更改未反映在WatchKit Extension中
的NSManagedObject我取的手表(姑且称之为Parent
)含有与另一个NSManagedObject一个一对多的关系(我们称之为Child
)。我从Watch目标中提取Parent
,假设它的属性已保存到核心数据并反映最新的值。
Parent
的属性始终反映从Watch中提取的更新值。但Child
关系对象没有。真奇怪的是,对Child
的更改仍然存在于iPhone应用程序的一面,但不在Watch中。我的代码从观察获取物体看起来是这样的:
let entityDesc = NSEntityDescription.entityForName("Parent", inManagedObjectContext: WatchCoreDataProxy.sharedInstance.managedObjectContext!)
let request: NSFetchRequest = NSFetchRequest()
request.entity = entityDesc
let predicate = NSPredicate(format: "loadedOnWatch == 1")
request.predicate = predicate
var error: NSError?
let array = WatchCoreDataProxy.sharedInstance.managedObjectContext!.executeFetchRequest(request, error: &error)! as NSArray
let parent: Parent = array[0] as! Parent
self.parentID = parent.objectID
self.parentTitleLabel.setText(parent.name) //reflects changes successfully
self.childArray = parent.children.sortedArrayUsingDescriptors([NSSortDescriptor(key: "position", ascending: true)]) as NSArray
let firstChild = self.intervalArray.objectAtIndex(0) as! Child
let title = firstChild.title
self.childTitleLabel.setText(title) //does not reflect changes
我已经试过核心数据的refreshObject:mergeChanges:
方法,没有运气。为什么Watch目标不能反映在同一个托管对象上下文中对Child
所做的更改?
UPDATE
我发现通过重写上述代码分别通过两个不同的NSFetchRequests撷取NSManagedObjects,然后刷新对象产生正确的值。下面是更新后的代码:
// Parent fetch
let parentEntityDesc = NSEntityDescription.entityForName("Parent", inManagedObjectContext: WatchCoreDataProxy.sharedInstance.managedObjectContext!)
let parentRequest: NSFetchRequest = NSFetchRequest()
parentRequest.entity = parentEntityDesc
let parentPredicate = NSPredicate(format: "loadedOnWatch == 1")
parentRequest.predicate = parentPredicate
var parentError: NSError?
let array = WatchCoreDataProxy.sharedInstance.managedObjectContext!.executeFetchRequest(parentRequest, error: &parentError)! as NSArray
let parent: Parent = array[0] as! Parent
self.parentTitleLabel.setText(parent.name)
// Child fetch
let childEntityDesc = NSEntityDescription.entityForName("Child", inManagedObjectContext: WatchCoreDataProxy.sharedInstance.managedObjectContext!)
let childRequest: NSFetchRequest = NSFetchRequest()
childRequest.entity = childEntityDesc
let childPredicate = NSPredicate(format: "parent = %@", parent)
childRequest.predicate = childPredicate
let sort = NSSortDescriptor(key: "position", ascending: true)
childRequest.sortDescriptors = [sort]
var error: NSError?
self.childArray = WatchCoreDataProxy.sharedInstance.managedObjectContext!.executeFetchRequest(childRequest, error: &error)! as NSArray
let firstChild = self.childArray[0] as! Child
WatchCoreDataProxy.sharedInstance.managedObjectContext?.refreshObject(firstChild, mergeChanges: true)
let childTitle = firstChild.title
self.childTitleLabel.setText(childTitle)
那么,为什么会取的NSManagedObjects这种方式得到正确的价值观,而不是依靠父母的关系?
嘿谢谢你的回答。我忘了提及我实际上已经创建了一个App Group来连接iPhone和Watch目标。我会用更多信息更新我的问题。 – hgwhittle