【问题标题】:WatchOS storing and sharing dataWatchOS 存储和共享数据
【发布时间】:2015-10-11 10:03:22
【问题描述】:

我有一个 Core Data 应用程序。这就像一个让我们说新闻应用程序。每个条目都有名称、id、日期、发布者、详细信息等。主要的 iOS 应用程序可以有很多新闻条目。我只想展示 WatchOS 应用程序的前 3 个新闻。由于获取新闻条目需要使用键盘,因此我无法从 Watch 端启动传输。共享数据的好策略是什么?我想过以下场景

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

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

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

    • 优点:数据量小,
    • 缺点:需要先将 NSManagedObject 转换为另一个对象,可能会发送相同的数据

您能帮我找到一种将 iOS 应用与 WatchOS 应用同步的更好方法吗?谢谢。

【问题讨论】:

    标签: ios core-data watchkit


    【解决方案1】:

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

    1. 您不必关心手表应用程序是否正在运行。当您将数据添加到应用程序上下文时,它会被添加到传输队列中,并且只要手表应用程序处于活动状态,它就会接收数据。
    2. 每次添加三个项目时,旧项目都会被覆盖。因此,队列中始终只有 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。如果没有安装应用程序,不要浪费资源将数据发送到深渊......

    【讨论】:

    • 感谢您的详细解释。我想正如你所说,我会选择路线 3。你认为 Core Data 在手表部分是过度杀戮吗?我有 12 个属性(字符串,NSDate)和一个数组属性,每个项目有 1-10 个项目。
    • 嗯,您需要某种持久性,并且您已经在主应用程序中使用 CoreData。因此,在您的手表扩展中使用 CoreData 将是合乎逻辑的决定。然而,也许现在是检查 RealmSwift 的好时机。我在最近的两个项目中一直在使用 RealmSwift,我再也不想回到 CoreData ;-)
    • 是的,您必须这样做才能通过应用程序上下文将它们传输到手表扩展
    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多