WatchOS存储和共享数据

时间:2015-10-11 10:03:22

标签: ios core-data watchkit

我有一个核心数据应用。就像一个让我们说一个新闻应用程序。每个条目都有名称,ID,日期,出版商,详细信息等。主iOS应用程序可以有很多新闻条目。我只想表明让我们用WatchOS应用程序说出前3个新闻。由于获取新闻条目需要键盘使用,我无法从Watch端启动传输。分享数据的好策略是什么?我想过以下场景

  1. 使用WatchConnectivity transferFile发送核心数据文件

    • PROS:轻松
    • 如果更改尚未保存到上下文中,可能没有大量不必要的数据,可能没有最新数据。
  2. 每当添加新闻时,请在保存到CoreData之前使用WatchConnectivity发送。

    • PROS:始终是相同的数据,
    • 缺点:大量不必要的数据,保存到新数据库的额外操作
  3. 当数据保存到Core Data时,查询最后三个对象并发送它们。

    • PROS:少量数据,
    • CONS:首先需要将NSManagedObject转换为另一个对象,可以发送相同的数据
  4. 你能帮我找到一个更好的方法来将iOS应用与WatchOS应用同步吗?感谢。

1 个答案:

答案 0 :(得分:4)

我认为最好的方法是使用应用程序上下文进行后台传输。这有以下优点:

  1. 您无需关心手表应用是否正在运行。当您将数据添加到应用程序上下文时,它会被添加到传输队列中,每当监视应用程序处于活动状态时,它就会收到数据。
  2. 每次添加三个项目时,旧项目都会被覆盖。因此,队列中始终只有3个项目。这是新闻应用程序的理想选择,您不希望用旧消息打扰您的用户。因此,多次发送相同的数据是没有问题的,只有最新的数据“幸存”。
  3. 唯一的缺点是您必须序列化NSManagedObject。我不知道您的对象有多复杂,但如果它们可以使用HyperSyncGroot

    等库

    这就是您将手机与应用同步的方式:

    <强> 1。设置会话:

    if WCSession.isSupported() {
        let session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
    

    在这两个地方执行此操作:在主应用程序中以及在手表扩展程序中。如果您只是将数据从主应用程序发送到手表,则无需在主应用程序端设置代理。

    <强> 2。实施委托方法:

    func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
        // deserialize the received data, 
        // store it in CoreData on your watch 
        // and update the UI
    }
    

    第3。发送数据:

    let dataDict = latestThreeNewsObjects.serializeToDictionary() // However you achieve this ;-) 
    do {
        try WCSession.defaultSession().updateApplicationContext(dataDict as! [String : AnyObject])
    } catch {
        print("Cannot send data to watch: \(error)")
    }
    

    那么,每次向主应用程序CoreData添加新消息时,都会获取最新的三个NSManagedObjects,将它们序列化为字典并更新应用程序上下文。这样,手表在活动时总会有最新的3条新闻。当它已经处于活动状态时,新闻会立即更新。

    还有一件事:在尝试向手表发送数据之前,您应该始终检查用户是否在手表上安装了应用程序。 WCSession具有以下属性:watchAppInstalled。如果没有安装该应用程序,请不要浪费资源将数据发送到深渊......