WatchOS存储和共享数据

Mea*_*her 0 core-data ios watchkit

我有一个核心数据应用程序。就像是说一个新闻应用。每个条目都有名称,id,日期,发布者,详细信息等。主要的iOS应用可以包含很多News条目。我只想显示WatchOS应用程序的前三个新闻。由于获取新闻条目需要使用键盘,因此我无法从Watch端启动传输。共享数据的最佳策略是什么?我想过以下情况

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

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

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

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

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

joe*_*ern 5

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

  1. 您不必担心手表应用程序是否正在运行。当您将数据添加到应用程序上下文中时,它将被添加到传输队列中,并且每当监视应用程序处于活动状态时,它将接收数据。
  2. 每次添加三个项目时,旧项目都会被覆盖。因此,队列中始终只有3个项目。对于新闻应用程序来说,这是理想的选择,因为您不想在旧应用程序上打扰用户。因此,多次发送相同的数据没有问题,只有最新的数据才能“生存”。

唯一的缺点是您必须序列化您的NSManagedObject。我不知道您的对象有多复杂,但是如果它们是您可以使用HyperSyncGroot之类的

因此,这就是您随后将手机与应用同步的方式:

1.设置会话:

if WCSession.isSupported() {
    let session = WCSession.defaultSession()
    session.delegate = self
    session.activateSession()
}
Run Code Online (Sandbox Code Playgroud)

在两个地方都可以做到这一点:在您的主应用程序和手表扩展中。如果您只是将数据从主应用程序发送到手表,则无需在主应用程序端设置委托。

2.实现委托方法:

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

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)")
}
Run Code Online (Sandbox Code Playgroud)

因此,每当您向主应用程序CoreData中添加新新闻项时,都获取最新的三个新闻项NSManagedObjects,将它们序列化为字典并更新您的应用程序上下文。通过这种方式,手表在启动时始终具有最新的3条新闻。当它已经处于活动状态时,新闻将立即更新。

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