2015-04-27 111 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

相關問題