【问题标题】:Notification of changes in Core Data SQLite store between iPhone and Apple Watch appiPhone 和 Apple Watch 应用之间的 Core Data SQLite 存储更改通知
【发布时间】:2015-08-12 14:58:33
【问题描述】:

我有一个 iPhone (iOS 8) 和 Apple Watch (watchOS 1) 应用程序,它们使用 Core Data(SQLite 商店,放置在共享应用程序组中)共享其数据。两个应用程序都使用共享框架中的相同数据访问代码。 NSPersistentStoreCoordinator 的设置方式如下:

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    let sharedContainerURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(self.sharedAppGroup)!
    let storeURL = sharedContainerURL.URLByAppendingPathComponent(self.databaseName)
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)

    var error: NSError? = nil
    if coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) == nil {
        fatalError("Unable to add persistent store: \(error)")
    }

    return coordinator
}()

据我了解,在运行时每个应用程序都有自己的 NSPersistenStoreCoordinator 实例(因为 iPhone 应用程序和 WatchKit 扩展确实有完全独立的地址空间),但这两个连接到完全相同的 SQLite 数据库文件。

当 Watch 应用更改公共 SQLite 存储中的某些数据时如何通知 iPhone 应用,反之亦然:当 iPhone 应用更改公共持久存储中的某些数据时如何通知 Watch 应用?

【问题讨论】:

    标签: ios core-data watchkit apple-watch


    【解决方案1】:

    我发现相当满意的解决方案是使用MMWormhole 库。

    它通过使用 CFNotificationCenter Darwin Notifications 和在共享应用程序组中写入/读取数据文件来工作,从而在 iOS 应用程序和应用程序扩展(手表应用程序、今天的小部件等)之间实现即时通信。

    基本代码如下:

    • 虫洞初始化

      wormhole = MMWormhole(applicationGroupIdentifier: appGroup, optionalDirectory: nil)
      
    • 将数据对象传递给虫洞

      let payload = ["Key": "Value"]
      wormhole.passMessageObject(payload, identifier: theSameMessageIdentifier)
      
    • 侦听来自虫洞的传入对象

      wormhole.listenForMessageWithIdentifier(theSameMessageIdentifier) { message -> Void in
      
          if let payloadDictionary = message as? Dictionary<String, String> {
              // Do some work
          } 
      }
      

    就这么简单。

    【讨论】:

    • 这个库可能实现了 Marcus S. Zarra 在他的回答中提到的想法。
    【解决方案2】:

    不容易。无法在两个应用程序之间发送直接通信。

    我目前在这方面的建议是使用磁盘上的文件,其中包含从一个应用程序更改为另一个应用程序的任何对象 ID。

    当您检测到保存到磁盘时,您会编写一个文件,例如,JSON 文件并包含最多三个数组:更新、插入、删除。文件名应该是某种形式的时间戳。

    另外,您应该查看其他应用程序创建的任何文件的目录并使用它们。加载 ObjectID,然后从 ala iCloud 或在 iOS 9 中创建一个远程通知。处理完后删除文件。

    在启动时,从其他存储中删除所有文件,因为您会自动知道启动前发生的任何事情。

    不简单,但相当直接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2017-09-11
      相关资源
      最近更新 更多