如何在使用CoreData时与Watch OS 2共享数据以显示在WKInterfaceTable中

我正在使用WatchConnectivity尝试将名为arrayOfOjects NSManagedObjecttypes的数据发送到Watch。 每个object都有一个名为title的string属性。

Watch上的InterfaceController加载并显示并清空表 – 因为数组是空的,所以当用户请求数据时,使用手机上的didReceiveMessage方法发送数据。

我不确定如何将字典数组添加到WKInterfaceTable以显示在WKInterfaceTable

有谁知道如何将数据发送到手表来显示在表中进行更改,并与手机同步回来?

Apple Watch:

 class ObjectsInterfaceController: WKInterfaceController, WCSessionDelegate { var session : WCSession! var objectsArray = [[AnyObject]]() @IBOutlet var table: WKInterfaceTable! @IBOutlet var titleLabel: WKInterfaceLabel! func loadTableData() { table.setNumberOfRows(self.objectsArray.count, withRowType: "CellRow") if self.objectsArray.count > 0 { for (index, name) in self.objectsArray.enumerate() { let row = self.table.rowControllerAtIndex(index) as! CellRowController row.objectCellLabel.setText(name.title) } } } override init() { super.init() loadTableData() } override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) // Interface Objects } override func willActivate() { // This method is called when watch view controller is about to be visible to user super.willActivate() //Check if session is supported and Activate if (WCSession.isSupported()) { session = WCSession.defaultSession() session.delegate = self session.activateSession() } } //Swift func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { let value = message["Value"] dispatch_async(dispatch_get_main_queue()) { self.objectsArray.removeAll() self.objectsArray.append(value! as! Array) self.loadTableData() } //send a reply replyHandler(["Value":"Yes"]) } } 

苹果手机

我已经获取所有对象并存储在数组中。

 var objectsArray = [Objects]() func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { //send a reply replyHandler(["Value": [objectsArray]]) } 

我需要能够修改的对象的属性,并保存在iPhone上的变化,但ATM我甚至不能发送数据和显示在表中:(我已经能够发送设备之间的字典中的简单的string值,但不数组或实际数据。

TL / DR:

您只能将基本types(如string,整数,双精度)发送到您的手表。 这个问题有更多关于发送自定义对象的细节 。

另一个问题:

即使存档或序列化pipe理对象, 仍然无法将手机中的特定数据发送至手表。

NSManagedObject自己的上下文中有效。 在这种情况下,托pipe对象在您的iOS应用程序中使用特定的NSMangedObjectContext注册。 除了上下文之外,托pipe对象是没有用的,托pipe对象上下文不存在于其他任何地方,除了电话。

NSManagedObject实例不打算在队列之间传递。 这样做可能会导致数据损坏并终止应用程序。 当需要将pipe理对象引用从一个队列转移到另一个队列时,必须通过NSManagedObjectID实例完成。

由于无法将托pipe对象从一个上下文(或线程或队列)传递到同一平台上的另一个上,因此您绝对不能在手机和其配对的手表之间传递托pipe对象。

你能做什么?

  • 如果您有办法在手机和手表之间共享Core Data存储,则可以将pipe理的对象ID转换为string(使用URIRepresentation ),然后将这些string传递给手表,然后将这些string转换回对象ID并获取相应的对象。 这个问题在这个问题上有详细的解释 。

    但是,watchOS 2不再支持应用程序组,并且让两个不同的商店在不同的设备间保持同步是非常复杂的。

  • 一个更轻松的解决scheme是传递有关标题的详细信息,跟踪您在手表上所做的任何更改,然后发送插入,删除或以其他方式更改的标题字典。

    然后电话将更新与那些改变的标题相对应的被pipe理对象。

    这与NSFetchedResultsControllerDelegate如何响应更改以保持其结果同步相似。

有谁知道如何将数据发送到手表来显示在表中进行更改,并与手机同步回来?

我给了你一个大概的概述。 任何更详细的内容都将过于宽泛,无法涵盖这个答案。 我只能build议开发者使用第三方框架,或者编写他们自己的实现。

一些考虑:

请记住,您不希望通过来回传输大量数据来降低用户的观看体验。 保持你的手表应用程序轻量级和响应,因为它的理想devise只能使用几秒钟。

如果您可以简化手表应用程序devise(例如,仅将待办事项列表项标记为已完成),则可以消除大部分“同步”开销,并将更复杂的任务委托给iOS应用程序。