2

WatchConnectivity用来尝试将NSManagedObject调用类型的数据发送arrayOfOjects到手表。每个object都有一个名为的字符串属性title

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

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

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

苹果手表:

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 我什至无法发送数据并显示在表中:( 我已经能够在设备之间的字典中发送简单的字符串值,但不能数组或实际数据。

4

1 回答 1

2

TL/DR:

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

另一个问题:

即使您将托管对象存档或序列化,仍然无法将特定数据从手机发送到手表。

ANSManagedObject其自身的上下文中有效。NSMangedObjectContext在这种情况下,托管对象会在您的 iOS 应用程序上注册到特定对象。托管对象除了它的上下文是没有用的,它的托管对象上下文不存在于电话以外的任何地方。

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

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

你能做什么?

  • 如果您有办法在手机和手表之间共享您的核心数据存储,您可以将托管对象 ID 转换为字符串(使用URIRepresentation),然后将这些字符串传递给手表,然后将这些字符串转换回对象 ID 并获取对应的对象。 这在这个问题中有详细解释

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

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

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

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

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

我给了你一个总体概述。任何更详细的内容都过于广泛,无法在此答案中涵盖。我只能建议开发人员要么使用第三方框架,要么编写自己的实现。

一些考虑:

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

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

于 2016-03-13T19:56:40.803 回答