Ios iPhone和Apple Watch应用程序之间核心数据SQLite存储更改通知
我有一个iPhone(iOS 8)和Apple Watch(watchOS 1)应用程序,它们使用核心数据(SQLite商店,位于共享应用程序组中)共享数据。这两个应用程序都使用放置在共享框架中的相同数据访问代码<代码>NSPersistentStoreCoordinator正在以以下方式设置:Ios iPhone和Apple Watch应用程序之间核心数据SQLite存储更改通知,ios,core-data,watchkit,apple-watch,Ios,Core Data,Watchkit,Apple Watch,我有一个iPhone(iOS 8)和Apple Watch(watchOS 1)应用程序,它们使用核心数据(SQLite商店,位于共享应用程序组中)共享数据。这两个应用程序都使用放置在共享框架中的相同数据访问代码NSPersistentStoreCoordinator正在以以下方式设置: lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = { let sharedContainerURL = NSFile
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
}()
据我所知,在运行时,每个应用程序都有自己的nsPersistentStoreCoordinator
实例(正如iPhone应用程序和WatchKit扩展程序有完全独立的地址空间),但这两个应用程序连接到完全相同的SQLite数据库文件
当Watch应用程序更改公共SQLite存储中的某些数据时,如何通知iPhone应用程序?反之亦然:当iPhone应用程序更改公共持久存储中的某些数据时,如何通知Watch应用程序?不容易。无法在两个应用程序之间发送直接通信 在这方面,我目前的建议是使用磁盘上的文件,这些文件包括从一个应用程序到另一个应用程序的任何更改的objectid 当您检测到保存到磁盘时,您会编写一个文件,例如JSON文件,其中最多包含三个数组:update、insert、delete。文件名应该是某种形式的时间戳 另外,你应该观察其他应用程序创建的任何文件的目录,并使用它们。加载ObjectID,然后从ala iCloud或在iOS 9中创建远程通知。然后在处理后删除该文件 启动时,从其他存储中删除所有文件,因为您将自动了解启动前发生的任何事情
不简单,但相当直接。我发现非常令人满意的解决方案是使用库 它通过使用CFNotificationCenter Darwin通知和在共享应用程序组中写入/读取数据文件来工作,从而在iOS应用程序和应用程序扩展(Watch应用程序、今天的小部件等)之间实现即时通信 基本代码如下所示:
- 虫洞初始化
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 } }
- 侦听来自虫洞的传入对象
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 } }
wormhole.listenForMessageWithIdentifier(SameMessageIdentifier){message->Void in 如果让payloadDictionary=消息作为字典{ //做些工作 } }
就这么简单。这个图书馆可能实现了马库斯·s·扎拉在回答中提到的想法。