我正在通過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