如何在使用CoreData时与Watch OS 2共享数据以显示在WKInterfaceTable中
我正在使用WatchConnectivity
尝试将名为arrayOfOjects
NSManagedObject
types的数据发送到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应用程序。
- CoreData:按类别集中的索引sorting项目
- 自定义select器用于NSSortDescriptor和NSFetchedResultsController
- 生成失败,错误命令/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc
- 在复杂对象上定制NSSortDescriptor
- swift – 来自预填充SQLite的CoreData
- 如何形成谓词从核心数据中获取包含来自数组的string元素的对象
- 核心数据获取NSManagedObject的修改date?
- 找不到momd文件:核心数据问题
- iCloud + CoreData – 如何避免预填充的数据重复?