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

时间:2016-03-10 23:26:04

标签: ios core-data watchkit watch-os-2 watchconnectivity

我正在使用WatchConnectivity尝试将名为NSManagedObject的{​​{1}}类型的数据发送到Watch。每个arrayOfOjects都有一个名为object的字符串属性。

Watch上的title加载并显示和清空表 - 因为数组为空,然后当用户请求数据时,它会使用手机上的InterfaceController方法发送。

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

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

Apple Watch:

WKInterfaceTable

iPhone

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

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

1 个答案:

答案 0 :(得分:2)

<强> TL / DR

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

另一个问题:

即使您对托管对象进行了归档或序列化,它的仍然无法将该特定数据从手机发送到手表。

NSManagedObject仅在其自己的上下文中有效。在这种情况下,托管对象在您的iOS应用上注册了特定的NSMangedObjectContext。托管对象除了其上下文之外没有用处,并且其托管对象上下文不存在于除手机之外的任何其他位置。

  

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

由于无法在相同的平台上将托管对象从一个上下文(或线程或队列)传递到另一个上下文,因此您无法在两者之间传递托管对象手机及配对的手表。

你能做什么?

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

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

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

    然后,手机会更新与这些已更改的标题对应的管理对象。

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

  

是否有人知道如何将数据发送到手表中以显示在表格中以进行更改并将其与手机同步?

我给了你一个概述。在这个答案中,任何更详细的内容都会过于宽泛。我可以建议的是,开发人员要么使用第三方框架,要么编写自己的实现。

一些注意事项:

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

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