2015-04-27 110 views
0

我正在通过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这种方式得到正确的价值观,而不是依靠父母的关系?

回答

3

这取决于你的NSManagedContext的结构。 在iPhone应用程序中保存对“某些”NSManagedObject上下文的更改是不够的,因为在WatchKit扩展中,实际上存在不同的上下文(它在不同的应用程序容器中是完全不同的应用程序)。

因此,您必须将更改更新到持久协调器中,该协调器实际上将它们保存到应用程序组容器或iCloud中的文件中。

+0

嘿谢谢你的回答。我忘了提及我实际上已经创建了一个App Group来连接iPhone和Watch目标。我会用更多信息更新我的问题。 – hgwhittle

相关问题