How To Share Data with Watch OS 2 使用 CoreData 时在 WKInterfaceTable 中显示

How To Share Data with Watch OS 2 to display in WKInterfaceTable when working with CoreData

我正在使用 WatchConnectivity 尝试将名为 arrayOfOjectsNSManagedObject 类型的数据发送到手表。每个 object 都有一个名为 title.

的字符串 属性

Watch 上的 InterfaceController 加载并显示为空 table - 正如预期的那样,因为数组为空,然后当用户请求使用 didReceiveMessage 发送数据时phone 上的方法。

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

有谁知道如何将数据发送到手表以在 table 中显示以进行更改并将它们同步回 phone?

苹果手表:

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"])

}
}

iPhone

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

var objectsArray = [Objects]()

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {

    //send a reply
    replyHandler(["Value": [objectsArray]])

}

我需要能够修改对象的属性并将更改保存在 iPhone 但 atm 我什至无法发送数据并在 table 中显示 :( 我一直能够在设备之间的字典中发送简单的字符串值,但不能发送数组或实际数据。

TL/DR:

您只能将基本类型(如字符串、整数、双精度)发送到您的手表。 This question has more details about sending custom objects.

其他问题:

即使您存档或序列化了托管的 objects,仍然不可能将特定数据从 phone 发送到手表。

A NSManagedObject 仅在 其自身的上下文中 有效。在这种情况下,托管 object 已在您的 iOS 应用程序中注册到特定的 NSMangedObjectContext。托管 object 除了它的上下文之外没有用,它的托管 object 上下文除了 phone.

之外不存在于其他任何地方。

NSManagedObject instances are not intended to be passed between queues. Doing so can result in corruption of the data and termination of the application. When it is necessary to hand off a managed object reference from one queue to another, it must be done through NSManagedObjectID instances.

由于无法将托管 object 从一个上下文(或线程或 queue)传递到 same 平台上的另一个上下文,您绝对可以在 phone 及其配对手表之间传递托管 object。

你能做什么?

  • 如果您有办法在 phone 和手表之间共享您的核心数据存储,您可以将托管的 object ID 转换为字符串(使用 URIRepresentation),然后将这些字符串传递给手表,然后将这些字符串转换回 object ID 并获取相应的 object。 This is explained in detail in this question.

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

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

    然后 phone 将更新与这些更改的标题相对应的托管 object。

    这类似于 NSFetchedResultsControllerDelegate 响应更改以保持其结果同步的方式。

Does anyone know how I can send the data to the watch to display in the table to make changes and sync them back with the phone?

我给了你一个大致的概述。任何更详细的内容都太宽泛了,无法包含在这个答案中。我只能建议开发人员要么使用 third-party 框架,要么编写自己的实现。

一些注意事项:

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

如果您可以简化您的手表应用程序设计(例如,仅将待办事项列表项标记为已完成),您可以消除大部分 "sync" 开销,并委派更复杂的任务到 iOS 应用程序。